2017-10-06 282 views
1

我有以下輸入XML:通過XSLT在兩個其他元素之間添加元素?

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

使用XSLT我想下面的輸出:

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

我的XSLT是:

<?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> 

但我沒有得到我的期望的輸出。我怎麼能把ccc元素放在使用身份模板的bbbddd元素之間?

如果有幫助,我可以使用XSLT 3.0。

+0

這裏你不需要XSLT 3.0 - XSLT 1.0很容易就足夠了。 – kjhughes

回答

2

Kenneth的答案是好的,但因爲這個問題被標記爲XSLT 3.0可以寫成更爲緊湊,所以我這個答案添加爲使用<xsl:mode on-no-match="shallow-copy"/>來表達身份轉化和利用<xsl:next-match/>委派的複製替代

<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> 

ddd元素。

+0

謝謝你的幫助,兩個答案都很好。 –

+0

非常高興看到用於比較的XSLT 3.0解決方案。 – kjhughes

2

使用與插入點之前或之後的元素匹配的第二個模板進行標識轉換,然後在複製匹配元素之後或之前插入新元素。即:

鑑於此輸入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> 
相關問題