我正在尝试从源XML复制一些部分,因为<xsl:copy>
忽略了根元素,我必须手动创建(或者可能有更好的方法,请提供任何建议)
source xml:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:header="http://www.test.com/header" >
<file_header >
<header:Header>
<aaa>123</aaa>
</header:Header>
</file_header>
<someNode>
<bbb>234</bbb>
</someNode>
<target>
<ccc>ccc</ccc>
<ddd>ddd</ddd>
</target>
<target>
<ccc>eee</ccc>
<ddd>fff</ddd>
</target>
</root>
预期结果:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:header="http://www.test.com/header" >
<file_header >
<header:Header>
<aaa>123</aaa>
</header:Header>
</file_header>
<someNode>
<bbb>234</bbb>
</someNode>
</root>
我使用的Xslt是这样的:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:header="http://www.test.com/header">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<xsl:element name="{node-name(node())}" namespace="{namespace-uri(node())}">
<xsl:copy>
<xsl:apply-templates select="//target[1]/preceding-sibling::node()"/>
</xsl:copy>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
结果不对,命名空间出现在每个子节点上,但不出现在根节点上... 这对你来说似乎很愚蠢,但请帮助我,谢谢!
答案 0 :(得分:0)
我尝试使用以下
替换您的<xsl:template match="/">...
模板
<xsl:template match="/node()">
<xsl:copy>
<xsl:apply-templates select="target[1]/preceding-sibling::node()"/>
</xsl:copy>
</xsl:template>
它看起来像你期望的那样工作。