使用xslt合并两个列表

时间:2016-03-21 16:43:51

标签: xml xslt

基本上我需要结合两个不同xslt变换的输出。

我正在使用" container.xslt"导入并组合两个内部xslts:" transform1.xslt"和" transform2.xslt"

这两个转换文件是由xslt工具程序生成的,所以我想避免对它们进行更改。

这是我的输入xml:

<Enrollments>
    <Enrollment>
        <MEDICAL id="11111111">
        </MEDICAL>
    </Enrollment>
</Enrollments>

这是我目前得到的输出:

<fields>
    <fields>
        <field name="ID1">
            <value>11111111</value>
        </field>
    </fields>
    <fields>
        <field name="ID2">
            <value>11111111</value>
        </field>
    </fields>
</fields>

以下是我正在寻找的输出:

<fields>
    <field name="ID1">
        <value>11111111</value>
    </field>
    <field name="ID2">
        <value>11111111</value>
    </field>
</fields>

container.xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="xs fn">

    <xsl:include href="./transform1.xslt"/>
    <xsl:include href="./transform2.xslt"/>

    <xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/>

    <xsl:variable name="list1">
        <xsl:call-template name="one" />
    </xsl:variable>

    <xsl:param name="list2">
        <xsl:call-template name="two"/>
    </xsl:param>

    <xsl:template name="mergedList" match="/">
        <fields>
            <xsl:copy-of select="$list1" />
            <xsl:copy-of select="$list2" />
        </fields>
    </xsl:template>

</xsl:stylesheet>

transform1.xslt

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn">
        <xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/>
        <xsl:template match="/" name="one">
            <fields>
                <field>
                    <xsl:attribute name="name" select="'ID1'"/>
                    <xsl:for-each select="Enrollments/Enrollment/MEDICAL">
                        <value>
                            <xsl:sequence select="fn:string(@id)"/>
                        </value>
                    </xsl:for-each>
                </field>
            </fields>
        </xsl:template>
    </xsl:stylesheet>

transform2.xslt

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fn="http://www.w3.org/2005/xpath-functions" exclude-result-prefixes="fn">
    <xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/>
    <xsl:template match="/" name="two">
        <fields>
            <field>
                <xsl:attribute name="name" select="'ID2'"/>
                <xsl:for-each select="Enrollments/Enrollment/MEDICAL">
                    <value>
                        <xsl:sequence select="fn:string(@id)"/>
                    </value>
                </xsl:for-each>
            </field>
        </fields>
    </xsl:template>
</xsl:stylesheet>

它可能完全属于另一个问题,但我会在这里添加它以防有人提出建议。我必须将这两行添加到我的转换文件中,以允许我在container.xslt中使用命名模板。避免更改导入的xlst

是理想的
<xsl:attribute name="name" select="'ID1'"/>

<xsl:attribute name="name" select="'ID2'"/>

提前感谢任何建议!我对xslt来说还是比较新手,还没有多少手写。

1 个答案:

答案 0 :(得分:0)

可能就像

一样简单
<xsl:template name="mergedList" match="/">
    <fields>
        <xsl:copy-of select="$list1/fields/field" />
        <xsl:copy-of select="$list2/fields/field" />
    </fields>
</xsl:template>

旧版本的答案

开始
<Enrollments>
    <Enrollment>
        <MEDICAL id="11111111">
        </MEDICAL>
    </Enrollment>
</Enrollments>

<fields>
    <field name="ID1">
        <value>11111111</value>
    </field>
    <field name="ID2">
        <value>11111111</value>
    </field>
</fields>

这么简单就足够了:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="UTF-8" byte-order-mark="no" indent="yes"/>

    <xsl:template match="Enrollments">
        <fields>
            <xsl:apply-templates select="Enrollment">
                <xsl:with-param name="name" select="'ID1'" />
            </xsl:apply-templates>
            <xsl:apply-templates select="Enrollment">
                <xsl:with-param name="name" select="'ID2'" />
            </xsl:apply-templates>
        </fields>
    </xsl:template>

    <xsl:template match="Enrollment">
        <xsl:param name="name" />
        <field name="{$name}">
            <value><xsl:value-of select="MEDICAL/@id" /></value>
        </field>
    </xsl:template>
</xsl:stylesheet>

你拥有的其他东西似乎严重过度设计了我。