如果第一个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> </xsl:text>
<xsl:value-of select="following::ss:wd"/>
<xsl:text> </xsl:text>
<xsl:value-of select="//ss:wd[2]"/>
<xsl:text> </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 :(得分: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> </xsl:text>
<xsl:value-of select="$wds[2]"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$wds[3]"/>
<xsl:text> </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
元素。