[英]Using XSLT how can I copy a specific XML subtree
我已經找到關於正確使用xsl:copy(XSLT 1.0)的各種答案,但是它們似乎都使用相同的<xsl:template match="@*|node()">
,對於復制整個文檔來說效果很好。 我正在努力僅匹配要復制其子樹並將其應用模板的特定節點。
例如,給定以下XML文檔:
<MyXML>
<a>
<b>c</b>
</a>
<d>
<e>f</e>
</d>
<g x="y">
<foo bar="baz">
<item name="aname">quux</item>
<item name="bname">xyzzy</item>
</foo>
</g>
</MyXML>
這個樣式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="item[@name='bname']/text()">
<xsl:value-of select="translate(current(), 'y', 'Y')" />
</xsl:template>
</xsl:stylesheet>
我想做的是只復制元素foo
及其屬性和子節點,同時應用翻譯'y'->'Y'。 我想要的結果是這樣的:
<foo bar="baz">
<item name="aname">quux</item>
<item name="bname">xYzzY</item>
</foo>
我認為將<xsl:template match="@*|node()">
更改為<xsl:template match="//foo">
或<xsl:template match="//foo/@*|//foo/node()">
。 我一直在猜測其他各種排列,但無法獲得所需的結果。
如果只想處理foo
元素,則可以簡單地添加一個與根節點匹配的模板,並將模板僅應用於所需的節點(從而刪除所有其他節點):
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="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="MyXML/g/foo"/>
</xsl:template>
<xsl:template match="item[@name='bname']/text()">
<xsl:value-of select="translate(., 'y', 'Y')" />
</xsl:template>
</xsl:stylesheet>
請注意,這是假設最多有一個foo
元素-否則結果將不是格式正確的XML文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.