XSLT 1.0转换

时间:2016-04-04 10:56:06

标签: xslt xslt-1.0

我正在尝试使用XSLT 1.0转换XML文件,但我遇到了麻烦。

输入

<task_order>
<Q>
    <record id="1">
        <column name="task_externalId">SPLIT4_0</column>
    </record>
    <record id="2">
        <column name="task_externalId">SPLIT4_1</column>
    </record>    
</Q>
<task>
    <id>SPLIT4</id>
    <name>test</name>
</task>
</task_order>

通缉结果

对于每个task_order元素:当有多个记录元素(SPLIT4和SPLIT4_1)时,我需要复制task元素并使用记录元素中的id更改原始task-id。

<task_order>
<Q>
    <record id="1">
        <column name="task_externalId">SPLIT4_0</column>
    </record>
    <record id="2">
        <column name="task_externalId">SPLIT4_1</column>
    </record>    
</Q>
<task>
    <id>SPLIT4_0</id>
    <name>test</name>
</task>
<task>
    <id>SPLIT4_1</id>
    <name>test</name>
</task>
</task_order>

有什么建议吗?

谢谢

1 个答案:

答案 0 :(得分:0)

首先使用身份模板开始,该模板将处理所有现有节点的复制

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

接下来,要稍微查看列,请考虑使用xsl:key

<xsl:key name="column" match="column" use="substring-before(., '_')" />

然后,您有一个匹配task的模板,您可以使用该键查找所有匹配的column元素,并为每个元素创建一个新的task元素

<xsl:template match="task">
    <xsl:variable name="task" select="." />
    <xsl:for-each select="key('column', id)">
        <!-- Create new task -->
    </xsl:for-each>
</xsl:template>

试试这个XSTL

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

    <xsl:key name="column" match="column" use="substring-before(., '_')" />

    <xsl:template match="task">
        <xsl:variable name="task" select="." />
        <xsl:for-each select="key('column', id)">
            <task>
                <id><xsl:value-of select="." /></id>
                <xsl:apply-templates select="$task/*[not(self::id)]" />
            </task>
        </xsl:for-each>
    </xsl:template>

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