基本上我需要结合两个不同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来说还是比较新手,还没有多少手写。
答案 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>
你拥有的其他东西似乎严重过度设计了我。