Java 当交换两个相同的行时,XSL转换会给出不同的结果
我正在尝试合并到一个svg文件中。我有两个文件,“bg.svg”:Java 当交换两个相同的行时,XSL转换会给出不同的结果,java,xslt,svg,Java,Xslt,Svg,我正在尝试合并到一个svg文件中。我有两个文件,“bg.svg”: 和“arrow.svg”: . 然后,我尝试将其与以下XSL模板合并: <xsl:template match="/svg:svg"> <xsl:copy> <xsl:apply-templates select="$bg-doc/svg:svg/svg:g" /> <xsl:apply-tem
和“arrow.svg”:
.
然后,我尝试将其与以下XSL模板合并:
<xsl:template match="/svg:svg">
<xsl:copy>
<xsl:apply-templates select="$bg-doc/svg:svg/svg:g" />
<xsl:apply-templates select="./@*|./node()" />
</xsl:copy>
</xsl:template>
。。。通过以下Java代码:
TransformerFactory工厂=TransformerFactory.newInstance();
Transformer Transformer=factory.newTransformer(新的StreamSource(新文件(“merge.xsl”));
transformer.transform(新的StreamSource(新文件(“arrow.svg”)),
新的StreamResult(新文件(“out.svg”));
此转换具有正确的结果:
但是,当我试图更改XSL模板11行和12行的顺序时:
<xsl:template match="/svg:svg">
<xsl:copy>
<xsl:apply-templates select="$bg-doc/svg:svg/svg:g" />
<xsl:apply-templates select="./@*|./node()" />
</xsl:copy>
</xsl:template>
。。。转换返回奇怪(无效)的XML:
你知道为什么会这样吗
但是,当我试图改变XSL的11行和12行的顺序时
模板:
<xsl:template match="/svg:svg">
<xsl:copy>
<xsl:apply-templates select="$bg-doc/svg:svg/svg:g" />
<xsl:apply-templates select="./@*|./node()" />
</xsl:copy>
</xsl:template>
在提供的XML文档上应用此转换时(arrow.svg
):
现在生成正确的结果:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:svg="http://www.w3.org/2000/svg">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="bg-doc" select=
"document('file:///c:/temp/delete/bg.svg')"/>
<xsl:template match="/svg:svg">
<xsl:copy>
<xsl:apply-templates select="@*" />
<xsl:apply-templates select="$bg-doc/svg:svg/svg:g" />
<xsl:apply-templates select="node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="500" height="500" id="arrow" xml:space="preserve"><g>
<circle cy="250px" cx="250px" r="200" style="fill:black"/>
<circle cy="250px" cx="250px" r="195" style="fill:white"/>
</g>
<g id="g10">
<path d="M 250 245 L 250 255 L 400 255 L 400 265 L 415 250 L 400 235 L 400 245 L 250 245 " style="fill:red;stroke:#500;"/>
</g>
</svg>
解释:复制元素的属性必须立即遵循该元素的
xsl:copy
指令。在复制其他元素后放置属性会导致将这些属性放置在最后一个复制的元素上,而不是属性的原始所有者上。噢,非常感谢,我完全忘记了属性!