2012-02-21 195 views
1

我有這樣的XML:無法獲得正確的XSLT輸出

<Section> 
    <Chapter> 
     <Head>Heading</Head> 
     <nametable> 
      <nametitle>MyTitle</nametitle> 
      <namedomain>MyDomain</namedomain> 
      <namevalue>value1</namevalue> 
     </nametable> 
     <nametable> 
      <nametitle>MyTitle2</nametitle> 
      <namedomain>MyDomain2</namedomain> 
      <namevalue>value2</namevalue> 
     </nametable> 
    </Chapter> 
</Section> 

我希望得到如下的輸出:

MyTitle2 
MyDomain2 
value2 

我用text()功能檢查的文本內容但它不打印任何東西。

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

<xsl:template match="//Chapter"> 
    <xsl:comment>Ignore Head tag</xsl:comment> 
    <xsl:apply-templates select="*[not(self::Head)]"/> 
</xsl:template> 

<xsl:template match="nametable"> 
    <xsl:for-each select="nametitle"> 
     <xsl:if test="text()='MyTitle2'"> 
      <xsl:apply-templates select="nametitle" /> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

<xsl:template match="nametitle"> 
    <xsl:apply-templates /> 
</xsl:template> 

</xsl:stylesheet> 

我做錯了什麼?

謝謝!

約翰

回答

1

你的問題是在這裏

<xsl:for-each select="nametitle"> 
    <xsl:if test="text()='MyTitle2'"> 
     <xsl:apply-templates select="nametitle" /> 
    </xsl:if> 
</xsl:for-each> 

如果測試成功,則模板將被應用到nametitle孩子當前的節點。

但是,當前節點是nametitle,它沒有nametitle - 因此沒有選擇節點,也沒有應用模板。

解決方案

這種轉變

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

<xsl:output method="text"/> 

<xsl:template match="nametable[nametitle = 'MyTitle2']/*"> 
    <xsl:value-of select="."/> 
    <xsl:text>&#xA;</xsl:text> 
</xsl:template> 

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

時所提供的XML文檔應用:

<Section> 
    <Chapter> 
     <Head>Heading</Head> 
     <nametable> 
      <nametitle>MyTitle</nametitle> 
      <namedomain>MyDomain</namedomain> 
      <namevalue>value1</namevalue> 
     </nametable> 
     <nametable> 
      <nametitle>MyTitle2</nametitle> 
      <namedomain>MyDomain2</namedomain> 
      <namevalue>value2</namevalue> 
     </nametable> 
    </Chapter> 
</Section> 

產生想要的,正確的結果

 MyTitle2 
     MyDomain2 
     value2 
+0

謝謝,我感謝您的幫助! – JohnX 2012-02-21 22:11:49

+0

@JohnX:我很高興我的回答對你有用。請考慮接受這個答案(提示:點擊答案旁邊的複選標記)。 – 2012-02-21 22:15:57

+0

我有一個問題,如果我用''替換''併爲nametitle提供模板匹配(包含)您的解決方案將打印MyTitle而不是MyTitle2。我想知道爲什麼這是因爲支票是MyTitle2。 – JohnX 2012-02-22 16:56:30

2

兩種替代產生相同的結果:

<xsl:template match="nametitle[text()='MyTitle2']"> 
<xsl:value-of select="parent::node()"/> 
<xsl:text>&#xA;</xsl:text> 
</xsl:template> 

<xsl:template match="*[nametitle[text()='MyTitle2']]"> 
<xsl:value-of select="."/> 
<xsl:text>&#xA;</xsl:text> 
</xsl:template> 
+0

謝謝,我感謝您的幫助! – JohnX 2012-02-21 22:12:13