使用XSLT 1.0

时间:2015-11-19 17:38:55

标签: xslt xpath xslt-1.0

我有两个转换输入。

一个是源XML source.xml,看起来像这样:

<ROOT>
    <row>
        <id>1</id>
        <value>FooBar</value>
    </row>
    <row>
        <id>2</id>
        <value>Bar</value>
    </row>
    <row>
        <id>3</id>
        <value>FooFoo</value>
    </row>
</ROOT>

通过参数(<xsl:param name="input" />)将其他一个提供给转换。结构与上面的XML相同。但是包含不同数量的行和不同的值。

<ROOT>
    <row>
        <id>1</id>
        <value>Foo</value>
    </row>
    <row>
        <id>2</id>
        <value>Bar</value>
    </row>
</ROOT>

现在我需要合并这些输入。我想迭代source.xml并且对于每一行的id判断变量中是否存在相同的id并进行更新。如果变量$input中没有相同的id,我想创建新行。 换句话说:source.xml表示新数据,而输入参数表示我已有的数据。我希望他们合并。我想你明白了。

我尝试了很多方法来解决这个问题,但我总是坚持将id与创建不必要的行进行比较。限制是:

  • XSLT 1.0限制。
  • 只能使用XSLT参数导入比较输入。

输出应如下所示:

<ROOT>
    <row>
        <id>1</id>
        <value>FooBar</value>
    </row>
    <row>
        <id>2</id>
        <value>Bar</value>
    </row>
    <row>
        <id>3</id>
        <value>FooFoo</value>
    </row>
</ROOT>

1 个答案:

答案 0 :(得分:1)

如果提供的参数确实是节点集,那么您可以这样做:

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="*"/>

<xsl:param name="input" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="/ROOT">
    <xsl:copy>
        <xsl:apply-templates/>
        <xsl:apply-templates select="$input/ROOT/row[not(id = current()/row/id)]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>