在xsl文件中,我声明了Prov元素的模板。 xml源还包含一个Doc元素,但是该元素没有模板。
为什么xsl转换会从Doc元素中写入一些内部文本?
嗨,这是xml输入
<Root>
<Doc attr1="1" attr2="2" attr3="3">
<node1 attr1="1" />
<node2 attr1="2" />
<node3 attr1="3" />
<node4>1900-01-01T00:00:00Z</node4>
<node5>1900-01-01T00:00:00Z</node5>
<node6>
<node7>
<node8>xxx</node8>
<node9>yyyy</node9>
<node10>zzz</node10>
</node7>
</node6>
<node11>xxx</node11>
<node12>yyy</node12>
</Doc>
<Prov attr1="1" attr2="2" attr3="3" />
</Root>
我需要以下输出:
<Prov attr1="1" attr2="2" />
这是xsl:
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:output method="xml" encoding="ISO-8859-1" indent="yes" />
<xsl:template match="Prov" >
<xsl:element name="Prov">
<xsl:copy-of select="@attr1" />
<xsl:copy-of select="@attr2" />
</xsl:element>
</xsl:template>
</xsl:stylesheet>
这是实际输出:
<?xml version="1.0" encoding="ISO-8859-1"?>
1900-01-01T00:00:00Z
1900-01-01T00:00:00Z
xxx
yyyy
zzz
xxx
yyy
<Prov attr1="1" attr2="2"/>
答案 0 :(得分:1)
您看到的原因是built-in template rules。您只有与Prov
相匹配的模板。剩下的输入XML的整个Doc
分支将由这些内置模板处理,这些模板将所有文本节点复制到输出中。
为防止这种情况,您可以添加:
<xsl:template match="/Root" >
<xsl:apply-templates select="Prov"/>
</xsl:template>
到样式表,或者-如果愿意,将整个内容缩短为:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/Root" >
<Prov attr1="{Prov/@attr1}" attr2="{Prov/@attr2}"/>
</xsl:template>
</xsl:stylesheet>