2013-02-13 6 views
1

동적 루트 요소 (정적 이름 아님)와 그 루트 요소 아래에 일부 자식이있는 xml 트리가 있습니다. 이제 xslt 스크립트를 사용하여 두 번째 위치에 요소를 추가하려고합니다. 내가 어떻게 해?xslt를 사용하여 루트 노드에 두 번째 위치에 노드를 추가하는 방법

예 : XML :

<root> 
    <element1> 
    <element1a> 
     .. 
    </element1a> 
    </element1> 
    <element2 name="exampleName">This is text.</element2> 
</root> 

는 지금까지 다음과 같다 가지고 무엇

<root> 
    <element1> 
    <element1a> 
     .. 
    </element1a> 
    </element1> 
    <someNewElement>1234</someNewElement> 
    <element2 name="exampleName">This is text.</element2> 
</root> 

로 변환해야합니다. 그러나이 솔루션을 사용하면 노드가 첫 번째 위치에만 추가됩니다. 나는 두 번째 위치에서 그것을 필요로한다.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="2.0"> 

<xsl:template match="/"> 
    <xsl:apply-templates select="/*"/> 
</xsl:template> 

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

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

</xsl:stylesheet> 

답변

2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:template match="/*/*[1]"> 
    <xsl:next-match /> 
    <xsl:element name="newElement">4711</xsl:element> 
    </xsl:template> 

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

</xsl:stylesheet> 

이 문서의 요소의 첫 번째 자식 요소와 일치하는 템플릿을 정의 (next-match 사용) 정상 정체성 서식 처리를 수행 한 다음 다음과 같은 새로운 요소를 삽입합니다. 당신은 양자 택일로 두 번째 자식을 일치하고 전에 요소를 삽입 할

<xsl:template match="/*/*[2]"> 
    <xsl:element name="newElement">4711</xsl:element> 
    <xsl:next-match /> 
</xsl:template> 

을 할 수 있습니다. <root>에 하위 요소가 하나 뿐인 경우 /*/*[1] 버전은 newElement을 삽입하지만 /*/*[2]은 삽입하지 않는 두 가지 경우의 차이는 분명합니다.

+0

완벽하게 작동했습니다. 고마워요! – Hauke

1

이 방법에 대해 :

<root> 
    <element1> 
    <element1a> 
     .. 
    </element1a> 
    </element1> 
    <newElement>4711</newElement> 
    <element2 name="exampleName">This is text.</element2> 
</root> 

그리고 당신이 실제로 XSLT 2.0을 사용하는 경우, 당신은 대신 <xsl:next-match />를 사용할 수 있어야합니다 : 샘플 입력에서 실행

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:template match="/*/*[1]"> 
    <xsl:call-template name="copy" /> 
    <newElement>4711</newElement> 
    </xsl:template> 

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

</xsl:stylesheet> 

, 이것은 생산 <xsl:call-template name="copy" />을 입력하고 다른 템플리트에서 name 속성을 제거하십시오.

관련 문제