我目前正在为一些数据迁移编写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()|@*"/>