0
XSLT新手 - 我试图使用XSL转换来比较和合并来自两个不同位置的XML数据。使用XSL转换来比较两个节点,然后删除一个
数据目前看起来是这样的:
<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>
从本质上讲,我需要检查/表2/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>
很明显,我在亏损为所发生的事情 - 任何帮助表示赞赏!谢谢!
我已经做了一些XSLT了,但你会介意解释为什么这种转变不添加第二个'dateCreated'到Table? – Stacky
@Stacky我不知道我理解你的问题。最初的'table1'只有一个'dateCreated'。上面的样式表复制它的标签并在其中放入一个值。该值是来自'table2'的新值 - 如果存在 - 或现有值。 –
@Stacky:我想你是来自程序/ OOP编程背景,并且正在考虑。 XSLT转换不是在现场完成的(也就是说,您的数据与您操作的数组一样)。相反,XSLT是功能性的(在具有不可变数据对象的功能范例中考虑,每个操作都创建一个新的数据对象)。所以在这种情况下,您有三个数据“对象”:两个输入(table1和table2)和一个输出(result = table3)。上面的代码选择table1或table2并将其复制到table3,因此输入“对象”之一被设计丢弃。 – zx485