【问题标题】:get all the text of elemets using XSLT irespective of the tags使用 XSLT 获取元素的所有文本,而不考虑标签
【发布时间】:2012-03-28 16:12:42
【问题描述】:

我有一个 XML 文件并有数据

<text>
    <DIV style="TEXT-ALIGN: left; LINE-HEIGHT: 120%; FONT-SIZE: 10pt; PADDING-TOP: 14px">
    <FONT style="FONT-STYLE: italic; FONT-FAMILY: inherit; FONT-SIZE: 10pt; FONT-WEIGHT: bold">
    Spondon adsfa dtewr qewr qerm</FONT></DIV>

        <DIV style="TEXT-ALIGN: left; LINE-HEIGHT: 120%; FONT-SIZE: 10pt">
        <FONT style="FONT-FAMILY: inherit; FONT-SIZE: 10pt"><BR/></FONT>
        </DIV>
        <DIV style="TEXT-ALIGN: left; LINE-HEIGHT: 120%; FONT-SIZE: 10pt">
        <FONT style="FONT-FAMILY: inherit; FONT-SIZE: 10pt">
       fhretwe rtwer dfsdfhfgh dfgh dfg  sfgh sfg sfg citis with anticipated industry demand trends. Accordingly, in March 2010, the 
        Company recorded long-lived asset impairment losses of </FONT>
        <FONT style="FONT-FAMILY: inherit; COLOR: #000000; FONT-SIZE: 10pt; TEXT-DECORATION: none">
        $72 million</FONT>
        <FONT style="FONT-FAMILY: inherit; FONT-SIZE: 10pt"> 
        (Note13)to Other (charges) gains, net in the unaudited interim 
        consolidated statements of operations. The Spondon, Derby, United Kingdom 
        operations are included in the Consumer Specialties segment.</FONT></DIV></text>

并且我想使用 XSLT 从这个文件中获取所有文本,而不考虑元素和标签。 有什么东西可以得到这个。 我试过这个来获取源中所有元素的文本

<xsl:template match="/">
        <xsl:value-of select="normalize-space()"/>
</xsl:template>

【问题讨论】:

  • 请注意您的 XML 格式不正确。您需要一个包装您提供的示例的根元素。
  • 您尝试使用 normalize-space() 对我来说看起来是正确的。输出与您要查找的内容有何不同?
  • 实际上它在独立应用程序中工作,但如果我尝试在主应用程序中配置它,解析器只会读取 XSLT 的第一行并且不会生成输出
  • 您能提供来自应用程序的 sn-p 吗?听起来您的问题出在应用而不是 XSLT。

标签: html xml xslt xslt-1.0


【解决方案1】:

使用

string(/)

或使用

normalize-space(/)

计算上面的第一个 XPath 表达式会生成文档节点的字符串值——根据定义,这是 XML 文档中所有文本节点的串联(按文档顺序)。

计算上面的第二个 XPath 表达式会生成相同的字符串值,其中所有前导和尾随空白字符都已删除,所有中间空白字符序列已替换为单个空间。

更新

如果确实需要执行 XSLT 转换,那么最短的一种是:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>
</xsl:stylesheet>

【讨论】:

    【解决方案2】:

    我想你想要...

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
      </xsl:template>
    </xsl:stylesheet>
    

    对不起...我误读了问题...该模板为您提供了 XML 的副本...此模板将去除标记并只为您提供 PCDATA。

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="text" indent="yes" omit-xml-declaration="yes"/>
      <xsl:template match="@*|node()">
          <xsl:value-of select="."/>
          <xsl:apply-templates />      
      </xsl:template>
    </xsl:stylesheet>
    

    【讨论】:

      【解决方案3】:

      您需要类似于身份转换的东西。
      在这种情况下,身份是指返回其输入副本的函数的数学属性
      例如
      x - 0 = x
      y * 1 = y

      http://www.usingxml.com/Transforms/XslIdentity

      您可能需要调整身份样式表以防止它产生标签和属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2020-03-14
        • 2015-01-15
        相关资源
        最近更新 更多