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

我能够在&lt;important/&gt; 第一次出现之前获得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>&#10;</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>&#xa;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

获取请求的文本输出:

Helpful description
Another really important description
WARNING this is stupid

【讨论】:

以上是关于XSLT 从混合内容中提取文本?的主要内容,如果未能解决你的问题,请参考以下文章

1分钟快速生成用于网页内容提取的xslt

使用 XSLT 从网站中提取数据

使用 XSLT 从 JSON 输出中提取特定字段

在 Python 中提取 PDF 文件的文本和表格

使用 XSLT 从同一输入 XML 中提取的最新日期更新输入 XML

使用xslt从日志xml中提取svn修订