2014-02-08 138 views
0

輸入XML:XSLT不產生預期的輸出

<derivatives> 
    <derivative id="4" name="Audio Content"> 

     <operator id="1" name="Reliance"> 
      <referenceCode code="62033815"> 
       <mobileCircle id="1" name="Maharashtra"/> 
      </referenceCode> 
     </operator> 

     <operator id="22" name="Aircel"> 
      <referenceCode code="811327"> 
       <mobileCircle id="1" name="Maharashtra"/> 
      </referenceCode> 
     </operator> 

    </derivative> 
</derivatives> 

期望輸出XML:

<hellotune> 
    <operator>Aircel</operator> 
    <vcode>811327</vcode> 
</hellotune> 

電流輸出(它是錯誤的):

<hellotune> 
    <operator>Aircel</operator> 
    <vcode/> 
</hellotune> 

XSL(沒有工作):

<xsl:if test="derivatives/derivative/operator[@name='Aircel']"> 
    <hellotune> 
     <operator>Aircel</operator> 
     <vcode><xsl:value-of select="referenceCode/@code"/></vcode> 
    </hellotune> 
</xsl:if> 

注:使用XSL V1.0。爲簡潔起見,未提及完整的XSL。

回答

0

根據您提供的XSL,可以推測上下文節點是根節點,但從根節點開始,路徑referenceCode/@code與輸入中的任何內容都不匹配。追加derivatives/derivative/operator/,然後該路徑將成功找到referenceCode @code屬性,但會找到錯誤的屬性。試試這個推式的方法:

<xsl:template match="/"> 
    <xsl:apply-templates select="derivatives/derivative/operator[@name='Aircel']" /> 
</xsl:template> 

<xsl:template match="operator"> 
    <hellotune> 
     <operator><xsl:value-of select="@name" /></operator> 
     <vcode><xsl:value-of select="referenceCode/@code"/></vcode> 
    </hellotune> 
</xsl:template> 
0

中的元素<vcode>中的XPath上的表達是不是指在輸入文檔中的任何節點。匹配所有節點的最好方法是使用

//

就像在你的代碼,你可以使用

// referenceCode/@代碼 (但是這僅僅是爲信息目的和使用相同的不能得到你的結果)。

你可以試試這個方法:

<xsl:template match="/"> 

<hellotune> 
    <xsl:for-each select="//operator"> 
      <xsl:if test="./@name='Aircel'"> 
       <operator><xsl:value-of select="@name"/></operator> 
       <vcode><xsl:value-of select="referenceCode/@code"/></vcode> 
      </xsl:if> 
     </xsl:for-each> 
</hellotune> 
</xsl:template> 

希望這有助於:)