2012-07-19 5 views
2

가능한 중복 :
Generate/get xpath from XML node javaXSLT에서 현재 노드의 텍스트 값을 선택하여 추가 하시겠습니까?

이 내가 요청했습니다 previous question에서 후속 질문이다 (나는 이전과 같이 별도의 질문으로 물어하기로 결정했습니다 너무 커지고있는 것 같습니다.)

I했습니다 나 XPath 식의 집합으로 지정된 XML 문자열을 변환 할 수 있습니다 다음 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="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 테스트 애플리케이션을 알고있다. –

+0

고마워, 저 게시물은 아주 똑똑하다. 내가 그것에 대해 일찍 알았 으면 좋았을 텐데! – Larry

+0

네, 확실히, 확실한 해결책으로 보이고 더 완전한 문제 (+1)를 해결합니다. – Larry

답변

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 
관련 문제