2013-04-21 152 views
3

我有喜歡的xml:如何返回節點的文本,而不子節點文本

<item id="1"> 
     <items> 
      <item id="2">Text2</item> 
      <item id="3">Text3</item> 
     </items>Text1 
</item> 

如何返回<item id="1">(「文本1」)的文本? <xsl:value-of select="item/text()"/>什麼也沒有返回。

我的XSLT是:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="w3.org/1999/XSL/Transform"> 

    <xsl:template match="/"> 
    <html> 
     <body> 
     <xsl:apply-templates select="item"/> 
    </body> 
    </html> 
    </xsl:template> 

    <xsl:template match="item"> 
    <xsl:value-of select="text()"/> 
    </xsl:template> 
</xsl:stylesheet> 

我不知道還有什麼類型提交我的編輯

+0

這取決於當前的上下文是什麼(即當前節點是什麼)。在你的情況下,你必須定位在'item'元素的父項。您能否向我們展示您當前的XSLT,因爲這會澄清事情。謝謝。 – 2013-04-21 18:56:25

+0

    \t  \t  \t \t 
    \t \t \t \t \t \t \t \t \t \t \t \t \t
\t \t
\t
  • \t \t \t
  • user2304996 2013-04-21 19:00:50

    +0

    你真的可以編輯你的問題來包含XSLT,而不是添加評論嗎?謝謝! – 2013-04-21 19:03:49

    回答

    2

    這應該一般工作:

    <xsl:apply-templates select="item/text()" /> 
    

    納入到你的XSLT:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
        <xsl:key name="item_key" match="item" use="."/> 
        <xsl:strip-space elements="*" /> 
    
        <xsl:template match="/"> 
        <html> 
         <body> 
         <ul> 
          <xsl:apply-templates select="item"/> 
         </ul> 
         </body> 
        </html> 
        </xsl:template> 
        <xsl:template match="item"> 
        <li> 
         <xsl:apply-templates select="text()"/> 
        </li> 
        </xsl:template> 
    </xsl:stylesheet> 
    

    當你的樣品輸入運行,其結果是:

    <html> 
        <body> 
        <ul> 
         <li>Text1 
    </li> 
        </ul> 
        </body> 
    </html> 
    

    或者,這應該工作以及:

    <xsl:copy-of select="item/text()" /> 
    
    +0

    感謝您的回答 – user2304996 2013-04-21 19:18:52

    3

    如何返回<item id="1">( '文本1')的文本? <xsl:value-of select="item/text()"/>什麼也沒有返回。

    item元素有一個以上的文本節點的孩子和他們的第一個恰好是所有空白一個 - 這就是爲什麼你會得到「沒有」。

    一個測試是否節點的字符串值是不是所有的空白的方式是通過使用normalize-space()功能。

    在一個XPath表達式,你要想這

    /*/text()[normalize-space()][1] 
    

    這是一個完整的轉型,其結果是所需的文本節點:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    
    <xsl:template match="/*"> 
        <xsl:copy-of select="text()[normalize-space()][1]"/> 
    </xsl:template> 
    </xsl:stylesheet> 
    

    當這轉換應用於提供的XML文檔:

    <item id="1"> 
         <items> 
          <item id="2">Text2</item> 
          <item id="3">Text3</item> 
         </items>Text1 
    </item> 
    

    的希望,正確的結果產生:

    Text1 
    
    +0

    您的解決方案是否以任何方式優於''? – Borodin 2013-04-22 00:14:13

    +0

    @Borodin,是的。儘管兩個XPath表達式在XSLT 1.0/XPath 1.0中是相同的,但它們在XSLT 2.0/XPath 2.0中有不同的結果。我的答案中的XPath表達式在XSLT 1.0和XSLT 2.0中都產生了正確的結果。它具有清楚顯示將輸出多個可能選擇的節點中的哪一個的附加值。 – 2013-04-22 00:17:50

    相關問題