使用XSL转换比较两个节点,然后删除一个

时间:2015-11-04 05:20:29

标签: xml xslt

XSLT新手 - 我正在尝试使用XSL转换来比较和合并来自两个不同位置的XML数据。

目前的数据如下:

<root>
  <table1>
    <product>12345</product>
    <dateCreated>2015-06-04</dateCreated>
    <dateCompleted></dateCompleted>
  </table1>
  <table2>
    <dateCreated>2015-08-28T06:34:00</dateCreated>
    <dateCompleted></dateCompleted>
  </table2>
</root>

这就是它需要的方式:

<root>
  <newtable>
    <product>12345</product>
    <dateCreated>2015-08-28T06:34:00</dateCreated>
    <dateCompleted></dateCompleted>
  </newtable>
</root>

基本上,我需要检查/ table2 / dateCreated是否存在,并且有一个值,如果是,则将该节点放在最终的XML中。

XSL文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="table1/dateCreated | table2/dateCreated">
    <xsl:if test="table2/dateCreated !=''">
      <xsl:copy>
        <xsl:apply-templates select="table2/dateCreated"/>
      </xsl:copy>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

显然我对所发生的事情感到茫然 - 感谢任何帮助!谢谢!

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

<!-- 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 select="table1"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="table1">
    <newtable>
        <xsl:apply-templates/>
    </newtable>
</xsl:template>

<xsl:template match="dateCreated">
    <xsl:variable name="alt" select="/root/table2/dateCreated" />
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="string($alt)">
                <xsl:value-of select="$alt"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="."/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>