我有一个示例XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<XML>
<MetaData>
<Ref MDID='ID'></Ref>
</MetaData>
<MetaData2>
<Ref MDID='ID2'></Ref>
</MetaData2>
<Items ID='ID'>
<Item OID='haveit'></Item>
<Item OID='ornot'></Item>
</Items>
<Items ID= ID2'>
<Item OID='ornot'></Item>
<Item OID='ornot'></Item>
</Items>
</XML>
我必须对其进行转换,以便收到以下结果。
<?xml version="1.0" encoding="UTF-8"?>
<XML>
<MetaData>
<Ref MDID='ID'></Ref>
</MetaData>
<Items ID='ID'>
<Item OID='haveit'></Item>
</Items>
</XML>
首先,我必须检查项目'hasit'是否存在。然后我复制相应的父“Item”。然后我需要复制MDID等于项目ID的MetaData(在这种情况下为'ID',但我不知道我的实例中的确切值) 到目前为止我所拥有的:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.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:variable name="Item" select = "'haveit'"/>
<xsl:template match="XML">
<xsl:copy>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
<xsl:template match="Items">
<xsl:if test="child::Item[@OID = $Item]">
<xsl:copy>
<xsl:copy-of select="@*" /> <!-- copy attributes -->
</xsl:copy>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
使用此代码,我可以复制我想要的项目和相应的项目元素。现在我不知道如何获得正确的MetaData元素。如何检查Ref的MDID是否与Items ID具有相同的值?
答案 0 :(得分: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="oid" select="'haveit'"/>
<xsl:key name="meta" match="*" use="Ref/@MDID" />
<xsl:template match="/XML">
<xsl:variable name="matching-items" select="Items[Item/@OID=$oid]" />
<xsl:copy>
<xsl:copy-of select="key('meta', $matching-items/@ID)"/>
<xsl:apply-templates select="$matching-items"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Items">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:copy-of select="Item[@OID=$oid]" />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>