XSLT:避免输出剩余数据

时间:2014-07-21 14:29:27

标签: xml xslt xslt-1.0 xslt-2.0

我目前正在使用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输出未在模板中设置的任何剩余数据?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

作为抑制输出的替代方法,您可以确保只选择那些您感兴趣的处理元素:

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

根据您的输出需求,您可能需要创建根元素,例如

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