按外观顺序选择某些节点

时间:2014-01-10 16:15:39

标签: xml xslt xslt-1.0

如果第一个wd是数字,我想让我的代码挑出文档的前3个单词。

但是,由于某种原因,未正确选择第二个和第三个节点。 我的代码显示了我如何选择第一个节点,以及我尝试选择后续节点的两种方式。

       <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:value-of select="//ss:wd[1]"/>
          <xsl:text>&#10;</xsl:text>     
          <xsl:value-of select="following::ss:wd"/>
          <xsl:text>&#10;</xsl:text>     
          <xsl:value-of select="//ss:wd[2]"/>
          <xsl:text>&#10;</xsl:text>
        </xsl:template match="/">
        </xsl:stylesheet>

使用“跟随”轴术语不返回任何内容,[2]术语返回第600行中的wd(靠近文档的另一端)。 我看不出wd [2]与wd [1]的位置有什么关系。

我在这里缺少什么?

输入XML示例:

   <?xml version="1.0" encoding="UTF-16"?>
<?xml-stylesheet type="text/xsl" href="XSLT.xsl"?>
<document xmlns="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<page ocr-vers="OmniPageCSDK18" app-vers="OmniPage 19">
<description>
<source file="C:\Users\User\Documents\OCR\Unprocessed\7740412641.pdf" dpix="300" dpiy="300" sizex="2480" sizey="3509"/>
<theoreticalPage size="A4" marginLeft="1440" marginTop="0" marginRight="1440" marginBottom="1440" offsetX="-2" offsetY="-2" width="11918" height="16854"/>
</description>
<body>
<dd l="87" t="322" r="9667" b="16536">
<dd l="115" t="322" r="9667" b="16536">
<picture l="115" t="322" r="9667" b="16536" alignment="left">
</picture>
</dd>
<dd l="7205" t="1027" r="7366" b="1502">
<para l="7234" t="1027" r="7354" b="1502" alignment="left" spaceBefore="29" spaceAfter="4" lsp="exactly" lspExact="120" language="en">
<ln l="7234" t="1027" r="7354" b="1502" baseLine="1303" underlined="none" subsuperscript="none" fontSize="700" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="-23">
<wd l="7234" t="1027" r="7354" b="1502">1,044.47</wd>
</ln>
</para>
</dd>
<dd l="6859" t="1027" r="7020" b="1512">
<para l="6888" t="1027" r="7008" b="1512" alignment="left" spaceBefore="29" spaceAfter="4" lsp="exactly" lspExact="120" language="en">
<ln l="6888" t="1027" r="7008" b="1512" baseLine="1302" underlined="none" subsuperscript="none" fontSize="700" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="-21">
<wd l="6888" t="1027" r="7008" b="1512">5,222.37</wd>
</ln>
</para>
</dd>
<dd l="7502" t="1027" r="7663" b="1512">
<para l="7531" t="1027" r="7651" b="1512" alignment="left" spaceBefore="29" spaceAfter="9" lsp="exactly" lspExact="120" language="en">
<ln l="7531" t="1027" r="7651" b="1512" baseLine="1302" underlined="none" subsuperscript="none" fontSize="700" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="-21">
<wd l="7531" t="1027" r="7651" b="1512">6,266.84</wd>
</ln>
</para>
</dd>
<para>
<ln>
<wd>example that's much later</wd>
</ln>
</para>
</dd>
</body>
</page>
</document>

1 个答案:

答案 0 :(得分:0)

这会选择您想到的ss:wd元素。第一行:

<xsl:variable name="wds" select="//ss:wd"/>

将所有ss: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:output method="text" /> 

 <xsl:variable name="wds" select="//ss:wd"/>

 <xsl:template match="/">
  <xsl:value-of select="$wds[1]"/>
  <xsl:text>&#10;</xsl:text>
  <xsl:value-of select="$wds[2]"/>
  <xsl:text>&#10;</xsl:text>  
  <xsl:value-of select="$wds[3]"/>
  <xsl:text>&#10;</xsl:text>
 </xsl:template> 


</xsl:stylesheet>

<强>输出

1,044.47
5,222.37
6,266.84

编辑:为什么你的方法不起作用

首先,模板的结束标记为:

</xsl:template match="/">

然而它应该是:

</xsl:template>

但这可能只是一个错字。模板的真正问题是树中的位置。首先,您在树中的位置取决于模板匹配的元素。

您的模板与文档节点(/)匹配,因此这是您在树中的位置。现在,如果您使用应用Xpath表达式,那么轴将相对于您的位置进行解析。

你真正打算做的是:

<xsl:template match="ss:wd[not(preceding::ss:wd)]">
  <xsl:value-of select="."/>
  <xsl:value-of select="following::ss:wd[1]"/>
  <xsl:value-of select="following::ss:wd[2]"/>
</xsl:template>

以上语句是从wd元素进行评估的。顺便说一下,这使用另一个轴preceding::,以确保您匹配第一个wd元素。