我想用一些核心节点的数据克隆一个节点。剩下的值和其他一些数据应放入另一个克隆中。这是一个例子中最简单的描述。
要操作的Xml代码示例:
<root>
<element>
<number>13245</number>
<info>
<desc>
<value locale="en">some text in en</value>
<value locale="es">some text in es</value>
</desc>
<calc>
<value locale="en">some more text in en</value>
<value locale="es">some more text in es</value>
</calc>
<date>2014-08-21</date>
</info>
</element>
</root>
现在我想要实现的目标(并且始终失败)是一个输出,如:
<root>
<element>
<number>13245</number>
<info>
<desc>
<value locale="es">some text in es</value>
</desc>
<calc>
<value locale="es">some more text in es</value>
</calc>
<date>2014-08-21</date>
</info>
</element>
<element>
<number>13245</number>
<info>
<desc>
<value locale="en">some text in en</value>
</desc>
<calc>
<value locale="en">some more text in en</value>
</calc>
<date>2014-08-21</date>
</info>
</element>
</root>
转换应该在根中创建两个元素,其中包含一些核心值,如日期和数字,但每个元素只包含一个区域设置的值。
我不希望任何人为我编码,但一些指针会有很长的路要走。谢谢!
答案 0 :(得分:2)
这是达到要求输出的一种方式 - 不一定是最好的或最有效的方式:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform with tunneling parameter-->
<xsl:template match="@*|node()">
<xsl:param name="locale"/>
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:with-param name="locale" select="$locale"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="element">
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:with-param name="locale" select="'es'"/>
</xsl:apply-templates>
</xsl:copy>
<xsl:copy>
<xsl:apply-templates select="@*|node()">
<xsl:with-param name="locale" select="'en'"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="value[@locale]">
<xsl:param name="locale"/>
<xsl:if test="@locale=$locale">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:template>
</xsl:stylesheet>