XSLT 不同节点
XSLT distinct node
设置 1:
<?xml version='1.0' encoding='UTF-8'?>
<aa:Details xmlns:aa="urn:com.report">
<aa:Row>
<aa:Place>AAA</aa:Place>
<aa:PlaceID>A123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>BBB</aa:Place>
<aa:PlaceID>B123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>CCC</aa:Place>
<aa:PlaceID>C123</aa:PlaceID>
</aa:Row>
</aa:Details>
设置2
<?xml version='1.0' encoding='UTF-8'?>
<aa:Details xmlns:aa="urn:com.report">
<aa:Row>
<aa:Place>AAA</aa:Place>
<aa:PlaceID>A123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>EEE</aa:Place>
<aa:PlaceID>E123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>FFF</aa:Place>
<aa:PlaceID>F123</aa:PlaceID>
</aa:Row>
</aa:Details>
我上面有两组来自不同来源的数据。
我将如下合并两组数据
<?xml version='1.0' encoding='UTF-8'?>
<aa:Details xmlns:aa="urn:com.report">
<aa:Row>
<aa:Place>AAA</aa:Place>
<aa:PlaceID>A123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>BBB</aa:Place>
<aa:PlaceID>B123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>CCC</aa:Place>
<aa:PlaceID>C123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>AAA</aa:Place>
<aa:PlaceID>A123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>EEE</aa:Place>
<aa:PlaceID>E123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>FFF</aa:Place>
<aa:PlaceID>F123</aa:PlaceID>
</aa:Row>
</aa:Details>
我想根据以下条件转换并获得低于预期的输出
当第 2 组的 PlaceID
值等于第 1 组
时,通过移除任何节点,输出结果应来自第 2 组
期望输出
<?xml version="1.0" encoding="UTF-8"?>
<aa:Details xmlns:aa="urn:com.report">
<aa:Row>
<aa:Place>EEE</aa:Place>
<aa:PlaceID>E123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>FFF</aa:Place>
<aa:PlaceID>F123</aa:PlaceID>
</aa:Row>
</aa:Details>
我试过下面的 XSLT 代码,但它只删除了重复项
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:aa="urn:com.report">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="aa:Row[aa:PlaceID = following::aa:Row/aa:PlaceID]"/>
</xsl:stylesheet>
如果转换的输入是您问题中显示的组合数据集,那么所述任务是不可能完成的,因为处理器无法知道哪些节点来自哪个集合。
定义一个键
<xsl:key name="placeKey" match="aa:Row" use="aa:Place">
将第二个输入文档作为主要输入,select将文档 1 作为
<xsl:variable name="doc1" select="document('input1.xml')">
然后将 document2 处理为
<xsl:template match="/">
<aa:Details xmlns:aa="urn:com.report">
<xsl:copy-of select="aa:Row[exists(key('placeKey', ., $doc1)]"/>
</aa:Details>
</xsl:template>
这就是 XSLT 2.0。如果您仍在使用 XSLT 1.0 处理器,那么像往常一样,您将不得不再跳过几个环节。自从我使用 XSLT 1.0 以来已经有很长一段时间了,但我认为您必须将 copy-of 替换为
之类的东西
<xsl:for-each select="aa:Row">
<xsl:variable name="row" select="."/>
<xsl:for-each select="$doc1">
<xsl:if test="key('placeKey', $row/Place)">
<xsl:copy-of select="$row"/>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
设置 1:
<?xml version='1.0' encoding='UTF-8'?>
<aa:Details xmlns:aa="urn:com.report">
<aa:Row>
<aa:Place>AAA</aa:Place>
<aa:PlaceID>A123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>BBB</aa:Place>
<aa:PlaceID>B123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>CCC</aa:Place>
<aa:PlaceID>C123</aa:PlaceID>
</aa:Row>
</aa:Details>
设置2
<?xml version='1.0' encoding='UTF-8'?>
<aa:Details xmlns:aa="urn:com.report">
<aa:Row>
<aa:Place>AAA</aa:Place>
<aa:PlaceID>A123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>EEE</aa:Place>
<aa:PlaceID>E123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>FFF</aa:Place>
<aa:PlaceID>F123</aa:PlaceID>
</aa:Row>
</aa:Details>
我上面有两组来自不同来源的数据。
我将如下合并两组数据
<?xml version='1.0' encoding='UTF-8'?>
<aa:Details xmlns:aa="urn:com.report">
<aa:Row>
<aa:Place>AAA</aa:Place>
<aa:PlaceID>A123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>BBB</aa:Place>
<aa:PlaceID>B123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>CCC</aa:Place>
<aa:PlaceID>C123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>AAA</aa:Place>
<aa:PlaceID>A123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>EEE</aa:Place>
<aa:PlaceID>E123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>FFF</aa:Place>
<aa:PlaceID>F123</aa:PlaceID>
</aa:Row>
</aa:Details>
我想根据以下条件转换并获得低于预期的输出
当第 2 组的 PlaceID
值等于第 1 组
期望输出
<?xml version="1.0" encoding="UTF-8"?>
<aa:Details xmlns:aa="urn:com.report">
<aa:Row>
<aa:Place>EEE</aa:Place>
<aa:PlaceID>E123</aa:PlaceID>
</aa:Row>
<aa:Row>
<aa:Place>FFF</aa:Place>
<aa:PlaceID>F123</aa:PlaceID>
</aa:Row>
</aa:Details>
我试过下面的 XSLT 代码,但它只删除了重复项
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:aa="urn:com.report">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="aa:Row[aa:PlaceID = following::aa:Row/aa:PlaceID]"/>
</xsl:stylesheet>
如果转换的输入是您问题中显示的组合数据集,那么所述任务是不可能完成的,因为处理器无法知道哪些节点来自哪个集合。
定义一个键
<xsl:key name="placeKey" match="aa:Row" use="aa:Place">
将第二个输入文档作为主要输入,select将文档 1 作为
<xsl:variable name="doc1" select="document('input1.xml')">
然后将 document2 处理为
<xsl:template match="/">
<aa:Details xmlns:aa="urn:com.report">
<xsl:copy-of select="aa:Row[exists(key('placeKey', ., $doc1)]"/>
</aa:Details>
</xsl:template>
这就是 XSLT 2.0。如果您仍在使用 XSLT 1.0 处理器,那么像往常一样,您将不得不再跳过几个环节。自从我使用 XSLT 1.0 以来已经有很长一段时间了,但我认为您必须将 copy-of 替换为
之类的东西<xsl:for-each select="aa:Row">
<xsl:variable name="row" select="."/>
<xsl:for-each select="$doc1">
<xsl:if test="key('placeKey', $row/Place)">
<xsl:copy-of select="$row"/>
</xsl:if>
</xsl:for-each>
</xsl:for-each>