XSLT 解析了比我选择的更多的数据
XSLT parsing our more data than I'm selecting
如果能帮助我理解为什么我从转换中获得的数据多于我在样式表中实际选择的数据,我将不胜感激。所以这是我的 XML 示例:
<?xml version="1.0" encoding="UTF-8"?>
<e:root xmlns:e="http://www.yahoo.com">
<e:first>Hi</e:first>
<e:cds>
<e:cd>
<e:title>Eric</e:title>
</e:cd>
<e:cd>
<e:title>Tara</e:title>
</e:cd>
</e:cds>
</e:root>
这是我的样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:e="http://www.yahoo.com" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="e:cd">
<xsl:element name="T"><xsl:value-of select="e:title"/></xsl:element>
</xsl:template>
</xsl:stylesheet>
这是输出:
<?xml version="1.0" encoding="UTF-8"?>
Hi
<T>Eric</T>
<T>Tara</T>
如何阻止转换选择 <e:first>
节点?我没有在转换中明确要求它,但它出现在我的结果中(文本 'Hi')。我快要疯了,想知道为什么。非常感谢您提供的任何帮助。
这是因为XSLT's built-in template rules。
由于您在 e:cd
模板中使用 xsl:value-of
,因此您只需添加此模板即可:
<xsl:template match="text()"/>
另一种选择是缩小您正在处理的范围:
<xsl:template match="/">
<xsl:apply-templates select="e:root/e:cds"/>
</xsl:template>
此外,除非您动态创建元素名称,否则没有理由使用 xsl:element
...
<T><xsl:value-of select="e:title"/></T>
如果能帮助我理解为什么我从转换中获得的数据多于我在样式表中实际选择的数据,我将不胜感激。所以这是我的 XML 示例:
<?xml version="1.0" encoding="UTF-8"?>
<e:root xmlns:e="http://www.yahoo.com">
<e:first>Hi</e:first>
<e:cds>
<e:cd>
<e:title>Eric</e:title>
</e:cd>
<e:cd>
<e:title>Tara</e:title>
</e:cd>
</e:cds>
</e:root>
这是我的样式表:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:e="http://www.yahoo.com" version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="e:cd">
<xsl:element name="T"><xsl:value-of select="e:title"/></xsl:element>
</xsl:template>
</xsl:stylesheet>
这是输出:
<?xml version="1.0" encoding="UTF-8"?>
Hi
<T>Eric</T>
<T>Tara</T>
如何阻止转换选择 <e:first>
节点?我没有在转换中明确要求它,但它出现在我的结果中(文本 'Hi')。我快要疯了,想知道为什么。非常感谢您提供的任何帮助。
这是因为XSLT's built-in template rules。
由于您在 e:cd
模板中使用 xsl:value-of
,因此您只需添加此模板即可:
<xsl:template match="text()"/>
另一种选择是缩小您正在处理的范围:
<xsl:template match="/">
<xsl:apply-templates select="e:root/e:cds"/>
</xsl:template>
此外,除非您动态创建元素名称,否则没有理由使用 xsl:element
...
<T><xsl:value-of select="e:title"/></T>