基本上,我需要组合来自两个不同xslt转换的输出。
我使用"container.xslt“导入并组合了两个内部xslt:"transform1.xslt”和“Trans2.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相当陌生,也没有写多少东西。
发布于 2016-03-21 16:58:15
会不会就像
<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>在我看来,你的其他东西似乎设计得太过火了。
https://stackoverflow.com/questions/36136920
复制相似问题