为什么此xsl将文本写出节点

时间:2019-03-01 15:00:38

标签: .net xslt

在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"/>

1 个答案:

答案 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>