這裏是XML:XSLT如何通過每個節點的循環,敷在標籤
<svg xmlns:xlink="http://www.w3.org/1999/xlink">
<g>
<text id="b376">
<tspan x="59" y="156" font-size="13px" font-family="Arial">80</tspan>
</text>
<use xlink:href="#b376" fill="#000000"/>
<text id="b374">
<tspan x="59" y="204" font-size="13px" font-family="Arial">60</tspan>
</text>
<use xlink:href="#b374" fill="#000000"/>
<defs>testDef</defs>
</g>
</svg>
這裏是我的XSL輸入:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="g">
<g>
<xsl:apply-templates select="use|defs"/>
<defs>
<xsl:apply-templates select="*[name() != 'use' and name() != 'defs']"/>
</defs>
</g>
</xsl:template>
</xsl:stylesheet>
我想包裝的所有節點在DEFS標籤除了使用標籤和defs標籤外。所以2個文本節點將被包裹在defs標籤中,但是defs和use不會。
這裏是我得到
<?xml version="1.0"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink">
<g>
<use xlink:href="#b376" fill="#000000"/>
<use xlink:href="#b374" fill="#000000"/>
<defs>testDef</defs>
<defs>
<text id="b376">
<tspan x="59" y="156" font-size="13px" font-family="Arial">80</tspan>
</text>
<text id="b374">
<tspan x="59" y="204" font-size="13px" font-family="Arial">60</tspan>
</text>
</defs>
</g>
</svg>
這就是我想要的東西:
<?xml version="1.0"?>
<svg xmlns:xlink="http://www.w3.org/1999/xlink">
<g>
<use xlink:href="#b376" fill="#000000"/>
<use xlink:href="#b374" fill="#000000"/>
<defs>testDef</defs>
<defs>
<text id="b376">
<tspan x="59" y="156" font-size="13px" font-family="Arial">80</tspan>
</text>
</defs>
<defs>
<text id="b374">
<tspan x="59" y="204" font-size="13px" font-family="Arial">60</tspan>
</text>
</defs>
</g>
</svg>
我使用this在線工具測試。謝謝!
'[name(..)='g']'謂詞有點奇怪。以'g/*'開頭的位置路徑會更簡單和更自然。另外,我不考慮'[name()!= ...]'謂詞,我會考慮* no *謂詞,而是使用匹配'g/use | g/defs'的模板來替代。 –
你已經使用過'xsl:copy-of',你似乎指'xsl:copy'包含'xsl:apply-templates'。 –
我不同意'[name(..)='g']'謂詞很奇怪。 相反,它以相當自然的方式讀取: *父元素的名稱是'g'*。 另一種可能性是'[parent :: g和...]' - 都在** one **謂詞中。 –