第一個要更新的 xml 檔案“in.xml”:
<root attr="root">
<xItem key="1" th="1">
<m1 />
<b attr3="j" attr4="x">
<m4 />
<m3 attr4="11" />
<Chartr>
<tag1 title="tag1"/>
<Widget title="default1"/>
<tag2 title="tag2"/>
</Chartr>
<Chartu>
<tag3 title="tag3">
<tag4 title="tag4"/>
</tag3>
<Widget title="default2">
<default title="default3"/>
</Widget>
<tag5 title="tag5">
<tag4 title="tag5"/>
</tag5>
</Chartu>
<Itemz key="2" th="2">
<d>
<m6 />
<Chartn>
<Widget title="default4"/>
</Chartn>
</d>
<m5 attr5="gd"/>
</Itemz>
</b>
<Itemq key="3" th="3">
<Itemt key="4" th="4">
<Charto>
<Widget title="default5">
<default title="default6"/>
</Widget>
</Charto>
<m6 />
</Itemt>
<m7 />
</Itemq>
<Chartd />
<m2 />
</xItem>
</root>
第二個 xml 檔案“updates.xml”從中獲取資料以更新第一個檔案:
<updates attr="updates">
<xItem key="1">
<b>
<Chartr>
<Widget title="update1" title1="update11">
<update title="update2"/>
</Widget>
</Chartr>
<Chartu>
<Widget title="update3">
<update title="update4" title4="update44"/>
</Widget>
</Chartu>
<Itemz key="2">
<d>
<m6 />
<Chartn/>
</d>
</Itemz>
</b>
<Itemq key="3">
<Itemt key="4">
<Charto>
<Widget title="update5" x="23">
<update1 title="update6" x="23"/>
<update2 title="update7"/>
</Widget>
</Charto>
</Itemt>
</Itemq>
<Chartd/>
</xItem>
</updates>
update.xml 檔案與輸入檔案的不同之處在于它僅包含那些是 Widget 標記的祖先的標記并且缺少一些屬性。在 XSLT1.0 轉換之后,輸入樹被轉移到輸出樹,并替換了“updates.xml”檔案中的 Widget 標記。如果輸入檔案中有 Widget 標簽,但“updates.xml”檔案中沒有,則將輸入檔案中的 Widget 標簽傳輸到輸出樹。現在轉換檔案:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exslt="http://exslt.org/common"
exclude-result-prefixes="exslt"
version="1.0">
<xsl:output method="xml"/>
<xsl:key name="replacement" match="*[Widget]" use="local-name()"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="*[not(node())]|*[Widget]">
<xsl:variable name="this" select="."/>
<xsl:variable name="replacement">
<xsl:for-each select="$updates">
<xsl:copy-of select="key('replacement', local-name($this))"/>
</xsl:for-each>
</xsl:variable>
<xsl:choose>
<xsl:when test="exslt:node-set($replacement)/*">
<xsl:copy-of select="$replacement"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:param name="updates" select="document('updates.xml')"/>
</xsl:stylesheet>
轉換檔案后:
<root attr="root">
<xItem key="1" th="1">
<m1 />
<b attr3="j" attr4="x">
<m4 />
<m3 attr4="11" />
<Chartr>
<Widget title="update1" title1="update11">
<update title="update2" />
</Widget>
</Chartr>
<Chartu>
<Widget title="update3">
<update title="update4" title4="update44" />
</Widget>
</Chartu>
<Itemz key="2" th="2">
<d>
<m6 />
<Chartn>
<Widget title="default4" />
</Chartn>
</d>
<m5 attr5="gd" />
</Itemz>
</b>
<Itemq key="3" th="3">
<Itemt key="4" th="4">
<Charto>
<Widget title="update5" x="23">
<update1 title="update6" x="23" />
<update2 title="update7" />
</Widget>
</Charto>
<m6 />
</Itemt>
<m7 />
</Itemq>
<Chartd />
<m2 />
</xItem>
</root>
如何確保輸出檔案還包含 Widget 標簽的兄弟姐妹及其屬性和后代標簽,即 tag1、tag2、tag3、tag4、tag5,以便在 XSLT1.0 轉換后的輸出檔案如下所示:
<root attr="root">
<xItem key="1" th="1">
<m1 />
<b attr3="j" attr4="x">
<m4 />
<m3 attr4="11" />
<Chartr>
<tag1 title="tag1"/>
<Widget title="update1" title1="update11">
<update title="update2" />
</Widget>
<tag2 title="tag2"/>
</Chartr>
<Chartu>
<tag3 title="tag3">
<tag4 title="tag4" />
</tag3>
<Widget title="update3">
<update title="update4" title4="update44" />
</Widget>
<tag5 title="tag5">
<tag4 title="tag5"/>
</tag5>
</Chartu>
<Itemz key="2" th="2">
<d>
<m6 />
<Chartn>
<Widget title="default4" />
</Chartn>
</d>
<m5 attr5="gd" />
</Itemz>
</b>
<Itemq key="3" th="3">
<Itemt key="4" th="4">
<Charto>
<Widget title="update5" x="23">
<update1 title="update6" x="23" />
<update2 title="update7" />
</Widget>
</Charto>
<m6 />
</Itemt>
<m7 />
</Itemq>
<Chartd />
<m2 />
</xItem>
</root>
uj5u.com熱心網友回復:
通過將背景關系更改為實際的 Widget 并將其父名稱用作鍵,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exslt="http://exslt.org/common"
exclude-result-prefixes="exslt"
version="1.0">
<xsl:output method="xml"/>
<xsl:key name="replacement" match="Widget" use="local-name(parent::*)"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Widget">
<xsl:variable name="parentName" select="local-name(parent::*)"/>
<xsl:variable name="replacement">
<xsl:for-each select="$updates">
<xsl:copy-of select="key('replacement', $parentName)"/>
</xsl:for-each>
</xsl:variable>
<xsl:choose>
<xsl:when test="exslt:node-set($replacement)/*">
<xsl:copy-of select="$replacement"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy-of select="."/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:param name="updates" select="document('updates.xml')"/>
</xsl:stylesheet>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/474959.html
上一篇:從XMLURL獲取圖示
下一篇:在c#中將xml轉換為陣列
