XSLT 从混合内容中提取文本?
Posted
技术标签:
【中文标题】XSLT 从混合内容中提取文本?【英文标题】:XSLT to extract text from mixed content? 【发布时间】:2021-12-31 02:12:05 【问题描述】:假设我有以下 XML:
<schools>
<school>
<description>Helpful description</description>
</school>
<school>
<description>Another <important>really important</important> description</description>
</school>
<school>
<description><important>WARNING</important> this is stupid</description>
</school>
</schools>
我想将整个描述元素作为文本获取
Helpful description
Another really important description
WARNING this is stupid
我能够在<important/>
第一次出现之前获得text()
,但之后不行。我尝试过类似的方法。
<xsl:template match="description" mode="important_recursive">
<xsl:value-of select="node()/preceding-sibling::text()"/>
<xsl:apply-templates select="important" mode="important_recursive"/>
</xsl:template>
<xsl:template match="important" mode="important_recursive">
<span><xsl:value-of select="text()"/></span>
</xsl:template>
【问题讨论】:
您说“作为文本”,但您的代码显示span
。请显示您想要获得的准确、完整的结果(作为代码)。
内置模板也会复制文本节点,因此不清楚您何时决定需要采取任何复杂的努力来获取文本内容,它应该在不编写模板的情况下获得输出。
【参考方案1】:
元素的字符串值是其所有后代文本节点的连接。要获得您显示的结果(作为文本),您可以简单地执行以下操作:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8"/>
<xsl:template match="/schools">
<xsl:for-each select="school">
<xsl:value-of select="description"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
【讨论】:
【参考方案2】:作为@MartinHonnen mentioned,一个空的变换,
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
</xsl:stylesheet>
将通过内置模板输出文本:
Helpful description
Another really important description
WARNING this is stupid
如果您想消除虚假的空白,see @michael.hor257's answer,或使用xsl:strip-space
与匹配description
的简单模板在需要的地方放置换行符,而无需循环,
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="description">
<xsl:value-of select="."/>
<xsl:text>
</xsl:text>
</xsl:template>
</xsl:stylesheet>
获取请求的文本输出:
Helpful description
Another really important description
WARNING this is stupid
【讨论】:
以上是关于XSLT 从混合内容中提取文本?的主要内容,如果未能解决你的问题,请参考以下文章