2017-10-06 9 views
1

나는 다음과 같은 입력 XML이 있습니다XSLT를 통해 다른 두 요소 사이에 요소를 추가 하시겠습니까?

<root> 
    <aaa>some string aaa</aaa> 
    <bbb>some string bbb</bbb> 
    <ccc>some string ccc</ccc> 
    <ddd>some string ddd</ddd> 
</root> 

내 XSLT는 다음과 같습니다 : XSLT를 사용

<root> 
    <aaa>some string aaa</aaa> 
    <bbb>some string bbb</bbb> 
    <ddd>some string ddd</ddd> 
</root> 

나는 다음과 같은 출력하고자

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="root"> 
     <root> 
      <ccc>some string ccc</ccc> 
      <xsl:apply-templates select="@*|node()"/> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

하지만 내을받지 못했습니다 원하는 출력. ID 템플릿을 사용하여 ccc 요소를 bbbddd 요소 사이에 넣을 수 있습니까?

도움이 될 경우 XSLT 3.0을 사용할 수 있습니다.

+0

여기서 XSLT 3.0이 필요하지 않습니다. XSLT 1.0 만 있으면 충분합니다. – kjhughes

답변

2

케네스의 대답은 잘하지만 질문 XSLT 3.0로 태그 될 때 내가 다른

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

    <xsl:output indent="yes"/> 

    <xsl:mode on-no-match="shallow-copy"/> 

    <xsl:template match="ddd"> 
     <ccc>some string ccc</ccc> 
     <xsl:next-match/> 
    </xsl:template> 

</xsl:stylesheet> 

신원 변환을 표현하는 <xsl:mode on-no-match="shallow-copy"/>을 사용하고의 복사를 위임 할 <xsl:next-match/>를 사용하는 것으로,이 답을 추가 컴팩트 쓸 수있다 ddd 요소가 있습니다.

+0

도와 주셔서 감사합니다. 두 대답 모두 좋습니다. –

+0

비교를 위해 XSLT 3.0 솔루션을 확인해 주셔서 감사합니다. – kjhughes

2

삽입 점 전후의 요소와 일치하는 두 번째 템플릿으로 ID 변환을 사용한 다음 일치하는 요소를 복사하기 전이나 후에 새 요소를 삽입하십시오. 재치하려면 :

이 입력 XML을 감안할 때

,

<root> 
    <aaa>some string aaa</aaa> 
    <bbb>some string bbb</bbb> 
    <ddd>some string ddd</ddd> 
</root> 

이 XSLT,

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

    <xsl:output method="xml" indent="yes"/> 

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

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

</xsl:stylesheet> 

이 출력 XML 생성합니다

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <aaa>some string aaa</aaa> 
    <bbb>some string bbb</bbb> 
    <ccc>some string ccc</ccc> 
    <ddd>some string ddd</ddd> 
</root>