2017-10-06 236 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> 
相关问题