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