2014-03-19 47 views
2

我的XML看起來像這樣如果兄弟節點前面的是這些蛋糕

<cakes> 
    <chocolate>for Tom</chocolate> 
    <vanilla>for Jim</vanilla> 
    <strawberry>for Harry</strawberry> 
    <vanilla>for Sue</vanilla> 
</cake> 

我要找的XSLT,將工作像這樣

<xsl:template match="vanilla"> 
    <xsl:if test="IF THE ELEMENT RIGHT BEFORE THIS ONE IS CHOCOLATE OR BLACKFOREST"> 
     <p>After a great cake <xsl:value-of select="chocolate | blackforest"/></p> 
    </xsl:if> 

    <p>There is a vanilla cake <xsl:value-of select="."/></p> 
</xsl:template> 

的一個輸出應該是

After a great cake for Tom 
There is a vanilla cake for Jim 
There is a vanilla cake for Sue 

我懷疑答案必須與先前的兄弟:: * [1],但我找不到如何測試如果這是一個特定的節點類型。

我在asp.net中開發。

回答

2

我懷疑答案與先前的兄弟:: * [1]有關,但我找不到如何測試這是否是特定的節點類型。

是的,這的確是解決方案。您可以通過檢查元素名稱來測試某個節點是否爲特定元素,即name()

請注意,如果此解決方案僅在它們立即位於vanilla元素之前,纔會「報告」chocolateblackforest元素。此外,它僅以受控的方式輸出文本,僅在xsl:text元素內。這就是爲什麼換行必須明確添加到XSLT代碼的原因。

樣式表

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

    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="vanilla"> 
     <xsl:if test="preceding-sibling::*[1][name() = 'chocolate' or name() = 'blackforest']"> 
      <xsl:text>After a great cake </xsl:text> 
      <xsl:value-of select="preceding-sibling::*[1]"/> 
      <xsl:text>&#10;</xsl:text> 
     </xsl:if> 
     <xsl:text>There is a vanilla cake </xsl:text> 
     <xsl:value-of select="."/> 
     <xsl:text>&#10;</xsl:text> 
    </xsl:template> 

    <xsl:template match="text()"/> 

</xsl:stylesheet> 

輸出

After a great cake for Tom 
There is a vanilla cake for Jim 
There is a vanilla cake for Sue 

實際上,name()返回元素的完整,限定名。如果一個元素有前綴,那麼前綴也會被返回。您可以使用local-name()僅輸出限定名稱的「本地」部分。