2012-07-19 86 views
2

可能重複:
Generate/get xpath from XML node java在XSLT中選擇並追加當前節點的文本值?

這是從previous question我問一個後續的問題,(我決定問作爲一個單獨的問題,如前似乎越來越大)。

我已經得到了下面的XSLT,這讓我改變一個指定的XML字符串轉換爲一組XPath表達式:

<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="text()"/> 

    <xsl:template match="*[not(*)]"> 
     <xsl:for-each select="ancestor-or-self::*"> 
      <xsl:value-of select="concat('/',local-name(),'[',count(preceding-sibling::*[local-name()=local-name(current())])+1,']')"/> 
     </xsl:for-each> 
     <xsl:text>&#xA;</xsl:text> 
     <xsl:apply-templates select="node()"/> 
    </xsl:template> 

</xsl:stylesheet> 

例如,XML字符串:

<ns1:create xmlns:ns1='http://predic8.com/wsdl/material/ArticleService/1/'> 
    <article xmlns:ns1='http://predic8.com/material/1/'> 
     <name /> 
     <description /> 
     <price xmlns:ns1='http://predic8.com/common/1/'> 
      <amount /> 
      <currency xmlns:ns1='http://predic8.com/common/1/‘>AUD</currency> 
     </price> 
     <id xmlns:ns1='http://predic8.com/material/1/‘>1</id> 
    </article> 
    <article xmlns:ns1='http://predic8.com/material/2/'> 
     <name xmlns:ns1='http://predic8.com/material/2/'>some name</name> 
     <description xmlns:ns1='http://predic8.com/material/2/'>some description</description> 
     <price xmlns:ns1='http://predic8.com/common/2/'> 
      <amount xmlns:ns1='http://predic8.com/common/2/'>00.01</amount> 
      <currency xmlns:ns1='http://predic8.com/common/2/'>USD</currency> 
     </price> 
     <id xmlns:ns1='http://predic8.com/material/2/'>2</id> 
    </article> 
</ns1:create> 

會轉化爲:

/create[1]/article[1]/name[1] 
/create[1]/article[1]/description[1] 
/create[1]/article[1]/price[1]/amount[1] 
/create[1]/article[1]/price[1]/currency[1] , AUD 
/create[1]/article[1]/id[1] , 1 
/create[1]/article[2]/name[1] 
/create[1]/article[2]/description[1] 
/create[1]/article[2]/price[1]/amount[1] 
/create[1]/article[2]/price[1]/currency[1] 
/create[1]/article[2]/id[1] 

我的問題: 怎麼樣,我可以修改XSLT,這樣我也可以選擇並追加當前節點的文本值。還注意到,因爲我提供的示例XML文件中已經說明,一些節點可能不包含文本值等

因此,對於上面的例子,我希望類似的信息(如逗號分隔輸出):

/create[1]/article[1]/name[1] , 
/create[1]/article[1]/description[1] , 
/create[1]/article[1]/price[1]/amount[1] , 
/create[1]/article[1]/price[1]/currency[1] , 
/create[1]/article[1]/id[1] , 
/create[1]/article[2]/name[1] , some name 
/create[1]/article[2]/description[1] , some description 
/create[1]/article[2]/price[1]/amount[1] , 00.01 
/create[1]/article[2]/price[1]/currency[1] , USD 
/create[1]/article[2]/id[1] , 2 
+0

**答案就在這裏提供**:http://stackoverflow.com/questions/4746299/generate-get-xpath-from-xml-node-java只要使用它。我瞭解用於測試XSLT的應用程序,該應用程序使用它作爲測試任何XSLT轉換的核心。 – 2012-07-19 15:28:35

+0

謝謝,這帖子是相當輝煌......希望我這件事早知道! – Larry 2012-07-19 15:41:55

+0

是的,當然,它肯定看起來強大的解決方案,解決了更多我的完整的問題(+1)的。 – Larry 2012-07-19 15:56:10

回答

0

它應該像在適當的節點上添加select=./text()一樣簡單,或者我錯過了一些微妙的問題?

<xsl:template match="*[not(*)]"> 
    <xsl:for-each select="ancestor-or-self::*"> 
     <xsl:value-of select="concat('/',local-name(),'[',count(preceding-sibling::*[local-name()=local-name(current())])+1,']')"/> 
    </xsl:for-each> 
    <xsl:text> , </xsl:text> 
    <xsl:value-of select="./text()"/> 
    <xsl:text>&#xA;</xsl:text> 
    <xsl:apply-templates select="node()"/> 
</xsl:template> 

輸出:

/create[1]/article[1]/name[1] , 
/create[1]/article[1]/description[1] , 
/create[1]/article[1]/price[1]/amount[1] , 
/create[1]/article[1]/price[1]/currency[1] , AUD 
/create[1]/article[1]/id[1] , 1 
/create[1]/article[2]/name[1] , some name 
/create[1]/article[2]/description[1] , some description 
/create[1]/article[2]/price[1]/amount[1] , 00.01 
/create[1]/article[2]/price[1]/currency[1] , USD 
/create[1]/article[2]/id[1] , 2