2014-09-05 78 views
-1

如果我有XSL變化值

<?xml version="1.0" encoding="utf-8" ?> 
<Rowsets> 
    <Rowset> 
     <Row> 
      <Name>Derek</Name> 
      <City>Seattle</City> 
     </Row> 
     <Row> 
      <Name>Bob</Name> 
     </Row> 
    </Rowset> 
</Rowsets> 

和xsl作爲XML:

<xsl:param name="Criteria1" /> 
<xsl:param name="Cirteria1AddBeforeText" /> 
<xsl:template match="/"> 
    <Rowsets> 
     <xsl:if test="count(/Rowsets/FatalError) = '0'"> 
      <xsl:for-each select="/Rowsets/Rowset"> 
       <Rowset> 
        <xsl:for-each select="Row"> 
         <xsl:copy-of select="." /> 
        </xsl:for-each> 
       </Rowset> 
      </xsl:for-each> 
     </xsl:if> 
    </Rowsets> 
</xsl:template> 

如何可以改變XSL使得:

<xsl:copy-of select="."/> 

部分的xsl被替換爲檢查節點名稱是否與參數F1相同的代碼,以便我可以輸出Criteria1 = City,Cirteria1AddBeforeT EXT =「城市:」

<?xml version="1.0" encoding="utf-8" ?> 
<Rowsets> 
    <Rowset> 
     <Row> 
      <Name>Derek</Name> 
      <City>City : Seattle</City> 
     </Row> 
     <Row> 
      <Name>Bob</Name> 
     </Row> 
    </Rowset> 
</Rowsets> 

什麼,我找還真是瞭解當前節點設置爲,每個語句都可以被修改,使得特定的元素都基於輸入參數保持所有其他的變質行如果沒有找到標準

回答

0

您不會更改輸入節點,因此您需要做的是使用模板而不是copy-of來根據需要創建修改的節點。我會用一個「身份轉換」開始,然後增加了對子元素的特殊情況處理這個問題:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:param name="Criteria1" /> 
    <xsl:param name="Cirteria1AddBeforeText" /> 

    <xsl:template match="@*|node()"> 
    <xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy> 
    </xsl:template> 

    <xsl:template match="Row/*"> 
    <xsl:copy> 
     <xsl:if test="name() = $Criteria1"> 
     <xsl:value-of select="$Cirteria1AddBeforeText" /> 
     </xsl:if> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

對於「致命錯誤」的邏輯,你可以添加額外的模板

<xsl:template match="Rowsets[FatalError]"> 
    <Rowsets>There was a fatal error</Rowsets> 
</xsl:template> 

(或者您希望用於致命錯誤情況的任何邏輯),如果輸入Rowsets下有任何FatalError元素,則這將優先於身份模板。

0

伊恩羅伯茨已經給你答案。我只是想指出,在目前的樣式表:

   <xsl:for-each select="Row"> 
        <xsl:copy-of select="." /> 
       </xsl:for-each> 

是同一件事:

   <xsl:copy-of select="Row" /> 

和類似:

 <xsl:for-each select="/Rowsets/Rowset"> 
      <Rowset> 
       <xsl:for-each select="Row"> 
        <xsl:copy-of select="." /> 
       </xsl:for-each> 
      </Rowset> 
     </xsl:for-each> 

可以簡單地表示爲:

 <xsl:copy-of select="Rowsets/Rowset" />