来自XSLT 1.0的输入元素的输出元素增长



我在将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>

相关内容

  • 没有找到相关文章

最新更新