通过XSL按行分组单词

时间:2014-01-07 10:24:24

标签: xml xslt

我正在使用已转换为XML的OCR文档。这意味着页面上的文字在文档中排列很奇怪(路径方面)。

在XML文档中,单词的布局如/document/...../ln/wd
我希望我的XSLT文档要做的是在他们自己的输出行上打印每行中的单词(即检测XML文档中的单词并“保留”他们的格式)。

到目前为止我所拥有的只是打印文档中的每个wd,无论格式/位置如何。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:ss="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd">
<xsl:template match="/">
  <html>
    <body>
        <xsl:value-of select="/document::descendant::wd"/>
    </body>
  </html>
</xsl:template>
</xsl:stylesheet>

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

your previous question开始,您使用的格式为(简化)

<document xmlns="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd">
  <!-- other intervening elements -->
  <ln>
    <wd>First</wd>
    <space/>
    <wd>line</wd>
  </ln>
  <ln>
    <wd>Second</wd>
    <space/>
    <wd>line</wd>
  </ln>
  <ln>
    <run>
      <wd>Word</wd>
      <tab />
    </run>
    <run>
      <wd>another</wd>
      <space/>
    </run>
  </ln>
</document>

所以你可以使用模板匹配

来很好地处理这个问题
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:ss="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd">
  <xsl:output method="text" />

  <xsl:template match="/">
    <xsl:apply-templates select="//ss:ln" />
  </xsl:template>

  <!-- for a ln, process the descendant words and spaces in document order -->
  <xsl:template match="ss:ln">
    <xsl:apply-templates select=".//ss:wd | .//ss:space | .//ss:tab" />
    <xsl:text>&#10;</xsl:text><!-- and add a newline character to the end -->
  </xsl:template>

  <!-- replace <space/> with a single space character -->
  <xsl:template match="ss:space">
    <xsl:text> </xsl:text>
  </xsl:template>

  <!-- replace <tab/> with a single tab character -->
  <xsl:template match="ss:tab">
    <xsl:text>&#09;</xsl:text>
  </xsl:template>

  <!-- wd elements use the default built in template rule that will
       just output their contained text -->
</xsl:stylesheet>

如果您有任何包含前导或尾随空格的wd元素,那么您可能需要添加一个显式模板来处理这些:

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

答案 1 :(得分:0)

  

我希望我的XSLT文档要做的是打印每行中的单词   在他们自己的输出行上(即检测XML文档中的单词)   并“保留”他们的格式。)

也许你可以简单地通过:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ss="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd">

<xsl:output method="text" encoding="utf-8" />

<xsl:template match="/">
<xsl:for-each select="descendant::ss:ln">
    <xsl:for-each select="descendant::ss:wd">
        <xsl:value-of select="." />
        <xsl:if test="position()!=last()">
            <xsl:text>, </xsl:text>
        </xsl:if>
    </xsl:for-each> 
    <xsl:if test="position()!=last()">
        <xsl:text>&#10;</xsl:text>
    </xsl:if>
</xsl:for-each> 
</xsl:template>
</xsl:stylesheet>

不确定“保留”他们的格式“是什么意思 - 尤其是当输出是纯文本时。