这里是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 **谓词中。 –