我的起始 XML 包含一個無序的平面目錄串列,其中包含一個元素,每個元素都有自己的 ID,以及一個子 ID(如果有的話)。
我的起始 XML 如下所示:
<root>
<catalogue>
<item>
<id>item2</id>
<child>
<id>item3</id>
</child>
</item>
</catalogue>
<catalogue>
<item>
<id>item1</id>
<child>
<id>item2</id>
</child>
</item>
</catalogue>
<catalogue>
<item>
<id>item3</id>
</item>
</catalogue>
</root>
我需要將其轉換為嵌套的樹層次結構,其中相應的子項寫入其父項內。
我生成的 XML 應如下所示:
<root>
<catalogue>
<item>
<id>item1</id>
<child>
<id>item2</id>
</child>
</item>
<catalogue>
<item>
<id>item2</id>
<child>
<id>item3</id>
</child>
</item>
<catalogue>
<item>
<id>item3</id>
</item>
</catalogue>
</catalogue>
</catalogue>
</root>
我已經接近獲得解決方案了,但是我無法讓生成的 XML 檔案不包含不必要的重復元素。
在以下 XML 檔案中,根目錄中的頂部和底部目錄是重復的不需要的條目。我只需要大中型目錄。
我當前的結果 XML 如下所示:
<root>
<catalogue>
<item>
<id>item2</id>
<child>
<id>item3</id>
</child>
</item>
<catalogue>
<item>
<id>item3</id>
</item>
</catalogue>
</catalogue>
<catalogue>
<item>
<id>item1</id>
<child>
<id>item2</id>
</child>
</item>
<catalogue>
<item>
<id>item2</id>
<child>
<id>item3</id>
</child>
</item>
<catalogue>
<item>
<id>item3</id>
</item>
</catalogue>
</catalogue>
</catalogue>
<catalogue>
<item>
<id>item3</id>
</item>
</catalogue>
</root>
我當前的結果 XML 是用這個 XSLT 檔案創建的:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="catalogue">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
<xsl:for-each select="/root/catalogue[item/id/text() = current()/item/child/id/text()]">
<xsl:apply-templates select="."/>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="node() | @*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我一直試圖找到解決方案太久了,所以我希望有人可以幫助我。
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:strip-space elements="*"/>
<xsl:key name="cat" match="catalogue" use="item/id" />
<xsl:template match="/root">
<xsl:copy>
<!-- start with items that are not children of any item -->
<xsl:apply-templates select="catalogue[not(item/id = //child/id)]"/>
</xsl:copy>
</xsl:template>
<xsl:template match="catalogue">
<xsl:copy>
<xsl:copy-of select="item"/>
<!-- recurse with current item's children -->
<xsl:apply-templates select="key('cat', item/child/id)"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/355456.html
