首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将两个列表与xslt合并

将两个列表与xslt合并
EN

Stack Overflow用户
提问于 2016-03-21 16:43:51
回答 1查看 860关注 0票数 0

基本上,我需要组合来自两个不同xslt转换的输出。

我使用"container.xslt“导入并组合了两个内部xslt:"transform1.xslt”和“Trans2.xslt”

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

这是我输入的xml:

代码语言:javascript
复制
<Enrollments>
    <Enrollment>
        <MEDICAL id="11111111">
        </MEDICAL>
    </Enrollment>
</Enrollments>

这是我目前正在获得的输出:

代码语言:javascript
复制
<fields>
    <fields>
        <field name="ID1">
            <value>11111111</value>
        </field>
    </fields>
    <fields>
        <field name="ID2">
            <value>11111111</value>
        </field>
    </fields>
</fields>

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

代码语言:javascript
复制
<fields>
    <field name="ID1">
        <value>11111111</value>
    </field>
    <field name="ID2">
        <value>11111111</value>
    </field>
</fields>

container.xslt

代码语言:javascript
复制
<?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

代码语言:javascript
复制
    <?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

代码语言:javascript
复制
<?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。

代码语言:javascript
复制
<xsl:attribute name="name" select="'ID1'"/>

代码语言:javascript
复制
<xsl:attribute name="name" select="'ID2'"/>

谢谢您的建议!我对xslt相当陌生,也没有写多少东西。

EN

回答 1

Stack Overflow用户

发布于 2016-03-21 16:58:15

会不会就像

代码语言:javascript
复制
<xsl:template name="mergedList" match="/">
    <fields>
        <xsl:copy-of select="$list1/fields/field" />
        <xsl:copy-of select="$list2/fields/field" />
    </fields>
</xsl:template>

旧版的答案

代码语言:javascript
复制
<Enrollments>
    <Enrollment>
        <MEDICAL id="11111111">
        </MEDICAL>
    </Enrollment>
</Enrollments>

代码语言:javascript
复制
<fields>
    <field name="ID1">
        <value>11111111</value>
    </field>
    <field name="ID2">
        <value>11111111</value>
    </field>
</fields>

像这样简单的事情就足够了:

代码语言:javascript
复制
<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>

在我看来,你的其他东西似乎设计得太过火了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36136920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档