复制节点后创建元素
Create element after having copied node
从 XML 数据复制后,希望创建第三个 link。
第三个元素不可见,我没有收到任何错误消息。
数据:
<?xml version="1.0" encoding="utf-8" ?>
<section
xmlns:link="http://www.example.com/4"
xmlns:xlink="http://www.example.com/5"
>
<data>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/1" />
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/2" />
</data>
</section>
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
xmlns:link="http://www.example.com/4"
xmlns:xlink="http://www.example.com/5"
>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/section">
<body>
<xsl:copy-of select="data" />
</body>
</xsl:template>
<!-- Identity transform -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Adding the 3rd link element -->
<xsl:template match="data">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:element name="link:schemaRef">
<xsl:attribute name="xlink:type">simple</xsl:attribute>
<xsl:attribute name="xlink:href">http://example.com/3</xsl:attribute>
</xsl:element>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<body xmlns:link="http://www.example.com/4" xmlns:xlink="http://www.example.com/5">
<data>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/1"/>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/2"/>
</data>
</body>
想要的结果:
<?xml version="1.0" encoding="UTF-8"?>
<body xmlns:link="http://www.example.com/4" xmlns:xlink="http://www.example.com/5">
<data>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/1"/>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/2"/>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/3"/>
</data>
</body>
更改您的模板:
<xsl:template match="/section">
<body>
<xsl:copy-of select="data" />
</body>
</xsl:template>
为此:
<xsl:template match="/section">
<body>
<xsl:apply-templates select="data"/>
</body>
</xsl:template>
在您的原始代码中,仅复制数据,永远不会调用“数据”匹配模板。
从 XML 数据复制后,希望创建第三个 link。 第三个元素不可见,我没有收到任何错误消息。
数据:
<?xml version="1.0" encoding="utf-8" ?>
<section
xmlns:link="http://www.example.com/4"
xmlns:xlink="http://www.example.com/5"
>
<data>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/1" />
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/2" />
</data>
</section>
XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0"
xmlns:link="http://www.example.com/4"
xmlns:xlink="http://www.example.com/5"
>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/section">
<body>
<xsl:copy-of select="data" />
</body>
</xsl:template>
<!-- Identity transform -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<!-- Adding the 3rd link element -->
<xsl:template match="data">
<xsl:copy>
<xsl:copy-of select="@*" />
<xsl:element name="link:schemaRef">
<xsl:attribute name="xlink:type">simple</xsl:attribute>
<xsl:attribute name="xlink:href">http://example.com/3</xsl:attribute>
</xsl:element>
<xsl:apply-templates/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<body xmlns:link="http://www.example.com/4" xmlns:xlink="http://www.example.com/5">
<data>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/1"/>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/2"/>
</data>
</body>
想要的结果:
<?xml version="1.0" encoding="UTF-8"?>
<body xmlns:link="http://www.example.com/4" xmlns:xlink="http://www.example.com/5">
<data>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/1"/>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/2"/>
<link:schemaRef xlink:type="simple" xlink:href="http://example.com/3"/>
</data>
</body>
更改您的模板:
<xsl:template match="/section">
<body>
<xsl:copy-of select="data" />
</body>
</xsl:template>
为此:
<xsl:template match="/section">
<body>
<xsl:apply-templates select="data"/>
</body>
</xsl:template>
在您的原始代码中,仅复制数据,永远不会调用“数据”匹配模板。