我正在嘗試比較 2 個串列,如果有 1 個或多個節點未出現在另一個串列中,我想在結果 xml 中輸出單個節點。
示例 XML:
<Root>
<Layers>
<List1>
<Name>test1</Name>
<Name>test2</Name>
<Name>test3</Name>
</List1>
</Layers>
<MoreLayers>
<List2>
<Name>test1</Name>
<Name>test4</Name>
<Name>test5</Name>
</List2>
</MoreLayers>
</Root>
應該看到 test2 和 test3 沒有出現在 List2 中并給出以下輸出:
<RootOut>
<UniqueNames>Yes</UniqueNames>
</RootOut>
我嘗試在 List1 上使用 for-each 回圈并與 List2 進行鍵比較,但這最終會為每個唯一名稱創建 1 個節點,因此會在輸出<UniqueNames>Yes</UniqueNames>中輸出 2 個節點。我確定我缺少一些簡單的東西,但我無法弄清楚。
XSLT:
<xsl:variable name="list1_names" select="/Root/Layers/List1/Name"/>
<xsl:key name="list2_lookup" match="/Root/MoreLayers/List2" use="Name"/>
<xsl:template match="/*">
<RootOut>
<xsl:call-template name="UniqueNames" />
</policy>
</xsl:template>
<xsl:template name="UniqueNames">
<xsl:for-each select="$list1_names">
<xsl:if test="(not(key( 'list2_lookup', Name )))">
<UniqueNames>Yes</UniqueNames>
</xsl:if>
</xsl:for-each>
</xsl:template>
uj5u.com熱心網友回復:
簡單地說:
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:key name="list2" match="List2/Name" use="." />
<xsl:template match="/Root">
<RootOut>
<xsl:if test="Layers/List1/Name[not(key('list2', .))]">
<UniqueNames>Yes</UniqueNames>
</xsl:if>
</RootOut>
</xsl:template>
</xsl:stylesheet>
請注意,這僅測驗是否有Names inList1未出現在 中List2,而不是相反(您的描述在這一點上有些模糊)。
另一種選擇是從相反的方向看它:
<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:key name="list1" match="List1/Name" use="." />
<xsl:template match="/Root">
<RootOut>
<xsl:if test="count(Layers/List1/Name) > count(key('list1', MoreLayers/List2/Name))">
<UniqueNames>Yes</UniqueNames>
</xsl:if>
</RootOut>
</xsl:template>
</xsl:stylesheet>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/471897.html
上一篇:什么是無效字符物體&ccb
