2012-06-28 83 views
0

工作。如果我得到這個XML(第一個標記爲空)的XPath空節點

<messages> 
    <message>                        
      <name>Kiro</name>                  
      <acc></acc>                  
      <date>20120506</date>                  
      <template>TMPL_ACC_UP</template>                  
     </message>                
     <message>                  
      <name>Third</name>                 
      <acc>555</acc>                 
      <date>20120507</date>                  
      <template>TMPL_ACC_UP</template>                 
     </message>                
</messages> 

現在我採取一切accpunts這個XPath表達式: 「//消息/ ACC /文()」,並獲得節點列表1(不包含空節點)。我想爲空標籤['555','']獲得空字符串。我如何實現這一目標?謝謝!

回答

1

我將遍歷節點並提取其文本值

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

<xsl:template match="/"> 
    <html> 
    <body>[ 
     <xsl:for-each select="//message/acc"> 
     '<xsl:value-of select="text()"/>', 
     </xsl:for-each>] 
    </body> 
    </html> 
</xsl:template> 
</xsl:stylesheet> 

結果:[ '', '555', ]

2

在XPath 2.0一襯墊這樣可以使用

/*/message/acc/string() 

但是,這不能作爲評估單個XPath 1.0表達式的結果產生

如果必須使用XPath 1.0,解決的辦法是選擇所有/*/message/acc元素,然後在PL承載的XPath,輸出的字符串值的每個所選擇的元件的

例如,該XSLT 1.0轉化

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

<xsl:template match="/"> 
    <xsl:text>[</xsl:text><xsl:apply-templates/><xsl:text>]</xsl:text> 
</xsl:template> 
<xsl:template match="acc"> 
    <xsl:if test="preceding::acc">, </xsl:if> 
    <xsl:text>'</xsl:text><xsl:value-of select="."/><xsl:text>'</xsl:text> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

當所提供的XML文檔應用:

<messages> 
    <message> 
      <name>Kiro</name> 
      <acc></acc> 
      <date>20120506</date> 
      <template>TMPL_ACC_UP</template> 
     </message> 
     <message> 
      <name>Third</name> 
      <acc>555</acc> 
      <date>20120507</date> 
      <template>TMPL_ACC_UP</template> 
     </message> 
</messages> 

產生想要的,正確的結果:

['', '555']