XSLT:将某些元素复制为另一个元素的子元素

时间:2018-12-02 15:25:49

标签: xml xslt copy element transformation

我知道这种转变是微不足道的。但不幸的是,我被卡住了。 我的输入如下:

<?xml version="1.0" encoding="UTF-8"?>
<tests>
    <test>Biography</test>
    <test>Job</test>
    <test>Salary</test>
    <test>FirtsName</test>
    <test>John</test>
    <test>Mary</test>
    <test>David</test>
    <test>Isabella</test>
    <test>SecondName</test>
    <test>Jones</test>
    <test>Williams</test>
    <test>Biography</test>
    <test>Job</test>
    <test>Salary</test>
    <test>FirtsName</test>
    <test>Paul</test>
    <test>Peter</test>
    <test>SecondName</test>
    <test>Castro</test>
    <test>Ricci</test>
<tests>

我要使用xslt 2.0做的是选择值为“ FirstName”的元素“ test”和值为“ SecondName”的元素“ test”之间的所有元素,并将它们复制为它们的子元素前一个“测试”元素,其值为“传记”。 输出应如下所示。

<?xml version="1.0" encoding="UTF-8"?>
<tests>
    <test>Biography
        <test>John</test>
        <test>Mary</test>
        <test>David</test>
        <test>Isabella</test>
    </test>
    <test>Job</test>
    <test>Salary</test>
    <test>FirtsName</test>
    <test>SecondName</test>
    <test>Jones</test>
    <test>Williams</test>
    <test>Biography
        <test>Paul</test>
        <test>Peter</test>
    </test>
    <test>Job</test>
    <test>Salary</test>
    <test>FirtsName</test>
    <test>SecondName</test>
    <test>Castro</test>
    <test>Ricci</test>
</tests>

非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

看看是否有帮助:

XSLT 2.0

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

<xsl:template match="/tests">
    <xsl:copy>
        <xsl:for-each-group select="test" group-starting-with="test[.='Biography']">
            <xsl:variable name="names" select="current-group()[. >> current-group()[.='FirtsName'] and . &lt;&lt; current-group()[.='SecondName']]" />
            <test>
               <xsl:value-of select="current-group()[1]"/> 
               <xsl:text>&#10;</xsl:text>
               <xsl:copy-of select="$names"/>
            </test>
            <xsl:copy-of select="current-group()[position() gt 1] except $names" />
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

演示https://xsltfiddle.liberty-development.net/94hvTAk