2014-01-10 29 views
1

如果第一个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: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> 
+0

对于初学者,您的问题缺少** 1 **一个示例XML输入和** 2 **整个模板,如果不是整个样式表。 –

+0

我不认为这是必要的,但我会在一瞬间添加它 – Dan

+0

如果您的问题是关于XSLT,请始终包含这些内容。在大多数情况下,无论如何都要求您添加它;-)。 –

回答

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元素。

+0

谢谢,这是行不通的。虽然我很困惑,为什么我的版本没有。在我看来,这只是我的一个更详细的版本。 – Dan

+0

只需一秒钟,我会添加一个解释。 –

+0

谢谢,我没想到它是由于模板! – Dan