2013-10-30 4 views
2

으로 태그 값을 대체 : 나는 문서의 값을 대체 할XSLT 나는이 XML 문서가 기본

<Document> 
    <a> 
     <b> 
      <c1>CCC111</c1> 
      <c2>CCCC222</c2> 
     </b> 
     <d> 
      <d1>DDD111</d1> 
      <d2>DDD222</d2> 
      <d3>DDD333</d3> 
     </d> 
</a> 
</Document> 

을/a는/D/D1 XXXXXX 기준 :

<Document> 
    <a> 
     <b> 
      <c1>CCC111</c1> 
      <c2>CCCC222</c2> 
     </b> 
     <d> 
      <d1>XXXXXX</d1> 
      <d2>DDD222</d2> 
      <d3>DDD333</d3> 
     </d> 
</a> 
</Document> 

나는이 XSLT를 :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="Document/a/d/d1/text()"> 
     XXXXXX 
</xsl:template> 

</xsl:stylesheet> 

하지만 동일한 입출력 획득/

고맙습니다.

+0

''태그가 두 번 열리지 않습니다. – kjhughes

+0

고맙습니다.하지만이 오류는 게시물에만 해당되며 XML은 유효합니다. –

+0

xsltproc을 사용하여 저에게 맞나요? 어떤 XSLT 프로세서를 사용하고 있습니까? –

답변

1

줄을 따라 어딘가에 간단한 필사 실수가 있다고 생각합니다. 당신이 당신의 XXXXXX 재정의 템플릿을 조금 단순화 수도 있지만 :

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

당신이있는 그대로의 작품을 게시하고 개념 아래로 권리가 있음을 보여했는지. 나는 당신이 XSLT 2.0 (Saxon HE)과 XSLT 1.0 (Saxon 6.5.5) 프로세서로 작업 한 것을 확인할 수 있습니다.

네임 스페이스 정의의 발견 이후 업데이트 :

좋아, 그래서 입력 XML 문서의 요소는 네임 스페이스에 있습니다. 문제 없습니다, 단지 tatatta 네임 스페이스에 대한 네임 스페이스 접두사를 선언하지 않고 같은 이름 공간을 고려하여 template/@match을 조정 : 내 입력 파일의

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:t="tatatta"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="t:d1/text()">XXXXXX</xsl:template> 

</xsl:stylesheet> 
+0

그래, 입력 파일이 일 때 실행됩니다 :

+0

@ l4r3nZu, 아, 설명해! 문제 없어. 네임 스페이스를 설명하기 위해 위에 업데이트되었습니다. – kjhughes

+0

잘 작동 해 주셔서 감사합니다 :) 및 XML의 값을 조인 할 수 있습니다.

2

내가 가진 : <Document xmlns="tatatta" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="totoot">

이는 것을 의미한다 문서의 요소는 tatatta 네임 스페이스에 있고 XPath 1.0의 접두어가없는 이름은 항상 네임 스페이스가없는 요소를 참조하므로 템플릿이 일치하지 않습니다.

<xsl:template match="t:Document/t:a/t:d/t:d1/text()" 
       xmlns:t="tatatta"> 
    <xsl:text>XXXXXX</xsl:text> 
</xsl:template> 

(또는 동일한 네임 스페이스를 사용해야 할 경우 당신이 당신의 xsl:stylesheet 대신 템플릿에 xmlns:t를 넣을 수 있습니다 : 당신은 접두사에 네임 스페이스를 매핑하고 패턴 예에서 그것을 사용할 필요가 다른 장소들).

0
 <?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
     <xsl:output indent="yes"/> 

    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Document/a/d/d1/text()[.='DDD111']">XXXXXX </xsl:template> 

    </xsl:stylesheet>