XSLT:避免输出剩余数据



我目前正在为一些数据迁移编写XSL转换脚本,但是我遇到了这个问题。

我将有具有多个节点的XML文件,我需要从中访问数据,例如:

<?xml version="1.0" encoding="UTF-8"?>
<note>
    <a>
        <fname>James</fname>
        <lname>Reeves</lname>
    </a>
    <b>
        <fname>Tim</fname>
        <lname>Stoddard</lname>
    </b>
</note>
但是,我只希望转换后的XML输出节点a的数据,而不是b,因此通常我会编写以下XSLT文件:
<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="a">
    <name first="{fname}" last="{lname}"/>
</xsl:template>
</xsl:transform>

然而,这是我得到的输出:

<name last="Reeves" first="James"/>TimStoddard
在这个例子中,我可以将模板匹配更改为b,这将得到这样的输出:
JamesReeves<name last="Stoddard" first="Tim"/>

那么是否有一种方法可以阻止XSLT输出任何未在模板中设置的剩余数据?

作为抑制输出的另一种选择,您可以确保只选择那些您感兴趣的元素进行处理:

<xsl:template match="/">
  <xsl:apply-templates select="//a"/>
</xsl:template>

根据你的输出需要,你可能想要创建一个根元素,例如

<xsl:template match="/">
  <root>
    <xsl:apply-templates select="//a"/>
  </root>
</xsl:template>

您可以通过匹配text()而不输出任何内容来抑制默认的文本复制:

<xsl:template match="text()"/>

如果您还想禁止属性的默认复制:

<xsl:template match="text()|@*"/>

相关内容

  • 没有找到相关文章

最新更新