使用XSLT 1.0从输入元素增加输出元素

时间:2018-04-25 21:01:39

标签: xslt xslt-1.0

在将xml转换为另一个xml时,我遇到了一些XSLT问题。我正在使用的xml和xslt更复杂,这个问题只是它的一部分。

问题

我希望存储在单个元素中的信息转到输出中的两个不同元素,然后对下一个元素执行相同的操作。

我的编程本能是找到制作两个列表并附加正确数据的XSLT 1.0版本,但我不知道如何在纯XSLT 1.0中这样做。

当前的解决方案是为每个我希望从这些元素中提取的数据调用每个语句,但最终会产生大量重复代码。一定有更好的方法! 它是什么,你能解释清楚吗?

一个例子

我有一个xml的字符元素。我想从每个字符中提取名称和引号,并将名称放在“character”元素中,并在“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>

3 个答案:

答案 0 :(得分:0)

使用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>

答案 1 :(得分:0)

试试这个:

<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>

答案 2 :(得分:0)

我只想在他们的父母身上设置骨架和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>