我有以下输入文件:
<!-- input.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<input>
<value>
aaa
<value>
bbb
<value>ccc</value>
</value>
</value>
</input>
预期产出:
<!-- output.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<ul>
<li>aaa</li>
<li>bbb</li>
<li>ccc</li>
</ul>
XSLT文件应该如何?我尝试了以下方法:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/input">
<ul>
<xsl:for-each select="//value">
<li> <xsl:value-of select="."/></li>
</xsl:for-each>
</ul>
</xsl:template>
</xsl:stylesheet>
但第一个结果(aaa)也包含其子树(bbb,ccc)的值。
答案 0 :(得分:1)
请尝试使用select="text()"
代替select="."
来仅选择文字内容。
答案 1 :(得分:1)
在您的情况下成功的关键是模板匹配值 应仅复制当前级别:
中的文字<xsl:value-of select="text()"/>
实际上,最好添加 normalize-space()以删除&#34;其他&#34; 白色空间字符:
<xsl:value-of select="normalize-space(text())"/>
打印出与当前级别相对应的内容 li 在元素中,您应该只为子节点添加 apply-templates :
<xsl:apply-templates select="*"/>
所以整个脚本可能如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="input">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="value">
<li>
<xsl:value-of select="normalize-space(text())"/>
</li>
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:transform>
有关工作示例,请参阅http://xsltransform.net/pNvs5w2