我想使用xslt从xml文件的元素中选择一些具有特定值的节点集。我确实得到了我想要的节点,但我也得到了一些来自textnodes的序列化文本。 你能帮我摆脱这个文本吗?
这是源文件:
<surveys>
<survey id='01'>
<category>cat1</category>
<questions>
<question id='1'>Y</question>
<question id='2'>Y</question>
<question id='3'>Y</question>
<question id='4'>Y</question>
</questions>
</survey>
<survey id='02'>
<category>cat2</category>
<questions>
<question id='1'>Y</question>
<question id='2'>Y</question>
<question id='3'>N</question>
<question id='4'>N</question>
</questions>
</survey>
<survey id='03'>
<category>cat1</category>
<questions>
<question id='1'>N</question>
<question id='2'>N</question>
<question id='3'>N</question>
<question id='4'>N</question>
</questions>
</survey>
<survey id='04'>
<category>cat3</category>
<questions>
<question id='1'>N</question>
<question id='2'>N</question>
<question id='3'>Y</question>
<question id='4'>Y</question>
</questions>
</survey>
</surveys>
这是转换文件:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<surveys>
<category/>
<xsl:apply-templates/>
</surveys>
</xsl:template>
<xsl:template match="survey[category = 'cat2']">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
这就是结果:
<surveys>cat1YYYY<survey id="02">
<category>cat2</category>
<questions>
<question id="1">Y</question>
<question id="2">Y</question>
<question id="3">N</question>
<question id="4">N</question>
</questions>
</survey>cat1NNNNcat3NNYY</surveys>
所以,我想摆脱&#34; cat1YYYY&#34;在调查元素之后的第一行和&#34; cat1NNNNNN3NNYY&#34;在调查元素之后的最后一行。 我想了解它为什么存在; - )
答案 0 :(得分:2)
我想了解它为什么会出现
它存在,因为你不加选择地应用模板 - 而XSLT有一些built-in template rules将文本节点复制为默认值。
为了防止这种情况发生,您可以添加自己的模板来覆盖默认行为:
<xsl:template match="text()" />
或 - 最好 - 选择性地应用模板以开始:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/surveys">
<surveys>
<category/>
<xsl:apply-templates select="survey[category = 'cat2']"/>
</surveys>
</xsl:template>
<xsl:template match="survey">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
BTW可以缩短为:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/surveys">
<surveys>
<category/>
<xsl:copy-of select="survey[category = 'cat2']"/>
</surveys>
</xsl:template>
</xsl:stylesheet>
答案 1 :(得分:0)
您可以通过添加
来发送多余的text()
个节点
<xsl:template match="text()" />
到你的样式表。