我在将XML转换为另一个XML时遇到了XSLT的问题。我正在使用的XML和XSLT更为复杂,此问题只是其中的一部分。
问题
我希望存储在单个元素中的信息转到输出中的两个不同元素,然后在下一个元素上执行相同的操作。
我的编程本能是找到XSLT 1.0版本的列出两个列表并附加正确的数据,但是我看不到如何在纯XSLT 1.0中执行此操作。
当前的解决方案是为我想从这些元素中提取的每种数据调用for-EATH语句,但这最终得到了很多重复代码。一定有更好的方法!您可以很好地解释吗?
示例
我有一个字符元素的xml。我想从每个字符中提取名称和引号,然后将名称放入"字符"中。a taglines中的元素和引号元素。
初始XML:
<Cast>
<Character>
<name>The Cheat</name>
<quote>Meh</quote>
</Character>
<Character>
<name>Homsar</name>
<quote>eey-y-yy</quote>
</Character>
</Cast>
输出XML:
<Cast>
<Character>
<name>The Cheat</name>
<name>Homsar</name>
</Character>
<taglines>
<quote>Meh</quote>
<quote>eey-y-yy</quote>
</taglines>
</Cast>
使用XSLT-1.0,您可以通过以下模板实现这一目标:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="Cast">
<xsl:copy>
<Character>
<xsl:apply-templates select="Character/name" />
</Character>
<taglines>
<xsl:apply-templates select="Character/quote" />
</taglines>
</xsl:copy>
</xsl:template>
<xsl:template match="name">
<name><xsl:value-of select="." /></name>
</xsl:template>
<xsl:template match="quote">
<quote><xsl:value-of select="." /></quote>
</xsl:template>
</xsl:stylesheet>
输出是:
<?xml version="1.0"?>
<Cast>
<Character>
<name>The Cheat</name>
<name>Homsar</name>
</Character>
<taglines>
<quote>Meh</quote>
<quote>eey-y-yy</quote>
</taglines>
</Cast>
尝试以下:
<xsl:template match="Cast">
<xsl:copy>
<xsl:element name="Character">
<xsl:apply-templates select="Character/name"/>
</xsl:element>
<xsl:element name="taglines">
<xsl:apply-templates select="Character/quote"/>
</xsl:element>
</xsl:copy>
</xsl:template>
<!-- Identity -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
我只需设置骨架,而xsl:copy-of
的父母下的所有相关元素:
<xsl:template match="Cast">
<Cast>
<Character>
<xsl:copy-of select="//name"/>
</Character>
<taglines>
<xsl:copy-of select="//quote"/>
</taglines>
</Cast>
</xsl:template>
结果XML:
<Cast>
<Character>
<name>The Cheat</name>
<name>Homsar</name>
</Character>
<taglines>
<quote>Meh</quote>
<quote>eey-y-yy</quote>
</taglines>
</Cast>