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>
显然我对所发生的事情感到茫然 - 感谢任何帮助!谢谢!
答案 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>