2014-01-06 2 views
0

Я работаю над XML-документом с XSLT, и я не могу заставить это работать.Печать значения с использованием XSLT/Xpath

Вот мой простой документ XSLT. Я использовал шаблон из w3schools.

Как вы можете видеть, я пытаюсь показать только два указанных слова. Я оставил его только в формате таблицы, чтобы как можно меньше изменить исходный код из w3schools.

Вместо того, чтобы эти два слова, отображаемые в таблице, я получаю это:

What I get

Если не что-то глупо, что я пропускаю в XPaths правильны. Я даже использовал онлайн-просмотрщик Xpath, чтобы подтвердить его. Я пробовал различные места размещения /, * и //. Также редактирование строки.

Вот часть входного XML. Это неполное, так как есть некоторая конфиденциальная информация, но вы можете видеть макет.

<?xml version="1.0" encoding="UTF-16"?> 
<?xml-stylesheet href="XSLT Stylesheet.XSL" type="text/xsl"?> 
<!--XML document generated using OCR technology from Nuance Communications, Inc.--> 
<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\dan\Pictures\7740411202.jpg" dpix="300" dpiy="300" sizex="3375" sizey="2330"/> 
<theoreticalPage size="Custom" marginLeft="134" marginTop="40" marginRight="45" marginBottom="1184" offsetY="-84" width="16200" height="11184"/> 
<language>en</language> 
</description> 
<body> 
<section l="14275" t="40" r="15715" b="228"> 
<column l="14275" t="40" r="15715" b="228"> 
<para l="14308" t="84" r="15697" b="197" alignment="left" spaceBefore="2" lsp="exactly" lspExact="174" language="en"> 
<tabs position="14308"/> 
<ln l="14669" t="84" r="15631" b="197" baseLine="182"> 
<run underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c"><wd l="0" t="0" r="0" b="0">Page</wd> 
<tab position="14669"/> 
</run> 
<run underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c"><wd l="15185" t="89" r="15218" b="194">1</wd> 
<space/> 
<wd l="15326" t="84" r="15470" b="197">of</wd> 
<space/> 
<wd l="15595" t="89" r="15631" b="194">1</wd> 
</run> 
</ln> 
</para> 
</column> 
</section> 
<dd l="139" t="266" r="8777" b="3762"> 
<dd l="4297" t="266" r="8777" b="1807" backColor="d3d3d2" bottomDistance="375"> 
<bottomBorder type="single" width="2" color="d7d7d7"/> 
<dd l="4297" t="266" r="8777" b="1807"> 
<table l="4297" t="266" r="8777" b="1803" alignment="left"> 
<gridTable> 
<gridCol>3899</gridCol> 
<gridCol>581</gridCol> 
<gridRow>1537</gridRow> 
</gridTable> 
<cell gridColFrom="0" gridColTill="0" gridRowFrom="0" gridRowTill="0" alignment="left" verticalAlignment="top"> 
<para l="4373" t="367" r="6322" b="679" alignment="left" li="72" spaceBefore="53" lsp="exactly" lspExact="197" language="en"> 
<ln l="4373" t="367" r="6322" b="482" baseLine="480" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c" forcedEOF="true"> 
<wd l="4373" t="367" r="4572" b="480">HP</wd> 
<space/> 
<wd l="4618" t="367" r="4944" b="480">VAT</wd> 
<space/> 
<wd l="4985" t="370" r="5213" b="482">No:</wd> 
<space/> 
<wd l="5388" t="367" r="6322" b="480">GB31414xxx 
</wd> 
</ln> 
<ln l="4373" t="562" r="5738" b="679" baseLine="677" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c" forcedEOF="true"> 
<wd l="4373" t="562" r="5446" b="679">Hewlett-Packard</wd> 
<space/> 
<wd l="5491" t="562" r="5738" b="677">Ltd.</wd> 
</ln> 
</para> 
<para l="4375" t="744" r="7368" b="1042" alignment="left" li="72" ri="828" lsp="exactly" lspExact="182" language="en"> 
<ln l="4375" t="744" r="7368" b="883" baseLine="859" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="-2" foreColor="0c0c0c"> 
<wd l="4375" t="744" r="4673" b="859">Cxxx</wd> 
<space/> 
<wd l="4718" t="744" r="5083" b="883">Rxxx,</wd> 
<space/> 
<wd l="5134" t="749" r="5522" b="862">Axxxx</wd> 
<space/> 
<wd l="5566" t="746" r="6007" b="859">Cxxxxx</wd> 
<space/> 
<wd l="6055" t="746" r="6701" b="883">Bracknell,</wd> 
<space/> 
<wd l="6754" t="744" r="7368" b="859">Berkshire</wd> 
<space/> 
</ln> 
<ln l="4375" t="929" r="5100" b="1042" baseLine="1042" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="-2" foreColor="0c0c0c"> 
<wd l="4375" t="929" r="4747" b="1042">Rxxx</wd> 
<space/> 
<wd l="4812" t="929" r="5100" b="1042">1xx</wd> 
</ln> 
</para> 
<para l="4375" t="1169" r="5590" b="1282" alignment="left" li="72" spaceBefore="61" lsp="exactly" lspExact="179" language="en"> 
<ln l="4375" t="1169" r="5590" b="1282" baseLine="1282" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c"> 
<wd l="4375" t="1169" r="4901" b="1282">GREAT</wd> 
<space/> 
<wd l="4949" t="1171" r="5590" b="1282">BRITAIN</wd> 
</ln> 
</para> 
<para l="4375" t="1406" r="6528" b="1550" alignment="left" li="72" spaceBefore="61" spaceAfter="242" lsp="exactly" lspExact="179" language="en"> 
<ln l="4375" t="1406" r="6528" b="1550" baseLine="1522" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c"> 
<wd l="4375" t="1406" r="4766" b="1522">Phone</wd> 
<space/> 
<wd l="4810" t="1406" r="5366" b="1522">Number:</wd> 
<space/> 
<wd l="5395" t="1411" r="5597" b="1550">(44</wd> 
<space/> 
<wd l="5664" t="1409" r="6007" b="1550">1xxx)</wd> 
<space/> 
<wd l="6062" t="1409" r="6528" b="1522">36xxxxx</wd> 
</ln> 
</para> 
</cell> 
<cell gridColFrom="1" gridColTill="1" gridRowFrom="0" gridRowTill="0" alignment="centered" verticalAlignment="top"> 
<picture l="8196" t="305" r="8738" b="1769" alignment="centered" ri="39" spaceBefore="39" spaceAfter="34"> 
</picture> 
</cell> 
</table> 
</dd> 
</dd> 
<dd l="4297" t="2182" r="8777" b="3762"> 
<para l="6444" t="2215" r="8683" b="2345" alignment="justified" li="2088" lsp="exactly" lspExact="207" language="en"> 
<ln l="6444" t="2215" r="8683" b="2345" baseLine="2342"> 
<run bold="true" underlined="none" subsuperscript="none" fontSize="900" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="7" foreColor="0c0c0c"><wd l="6444" t="2218" r="7390" b="2345">DELIVERY</wd> 
<space/> 
</run> 
<run bold="true" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="7" foreColor="0c0c0c"><wd l="7447" t="2220" r="7692" b="2342">TO</wd> 
<space/> 
<wd l="7795" t="2220" r="8683" b="2342">0000610727</wd> 
</run> 
</ln> 
</para> 
<para l="6449" t="2496" r="7646" b="2628" alignment="justified" li="2088" spaceBefore="84" lsp="exactly" lspExact="195" language="en"> 
<ln l="6449" t="2496" r="7646" b="2628" baseLine="2626"> 
<run bold="true" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="2" foreColor="0c0c0c"><wd l="6449" t="2496" r="7034" b="2628">Cxxxxx</wd> 
<space/> 
<wd l="7082" t="2503" r="7246" b="2626">IT</wd> 
<space/> 
</run> 
<run underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="2" foreColor="0c0c0c"><wd l="7298" t="2506" r="7646" b="2626">Parts</wd> 
</run> 
</ln> 
</para> 
<para l="6444" t="2736" r="7258" b="2868" alignment="justified" li="2088" spaceBefore="38" lsp="exactly" lspExact="207" language="en"> 
<ln l="6444" t="2736" r="7258" b="2868" baseLine="2866" underlined="none" subsuperscript="none" fontSize="900" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c"> 
<wd l="6444" t="2736" r="6936" b="2868">xxxxxx</wd> 
<space/> 
<wd l="6982" t="2741" r="7258" b="2868">Hse</wd> 
</ln> 
</para> 
<para l="6449" t="2976" r="7219" b="3108" alignment="justified" li="2088" spaceBefore="35" lsp="exactly" lspExact="207" language="en"> 
<ln l="6449" t="2976" r="7219" b="3108" baseLine="3108" underlined="none" subsuperscript="none" fontSize="900" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c"> 
<wd l="6449" t="2976" r="6965" b="3108">Oxxxx</wd> 
<space/> 
<wd l="7010" t="2976" r="7219" b="3108">Rd</wd> 
</ln> 
</para> 
<para l="6454" t="3218" r="8198" b="3348" alignment="justified" li="2088" spaceBefore="31" lsp="exactly" lspExact="207" language="en"> 
<ln l="6454" t="3218" r="8198" b="3348" baseLine="3346"> 
<run underlined="none" subsuperscript="none" fontSize="900" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="1" foreColor="0c0c0c"><wd l="6454" t="3218" r="6739" b="3348">SL9</wd> 
<space/> 
<wd l="6794" t="3218" r="7745" b="3348">7Bxxxx</wd> 
<space/> 
</run> 
<run underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="1" foreColor="0c0c0c"><wd l="7805" t="3223" r="8198" b="3346">Cross</wd> 
</run> 
</ln> 
</para> 
<para l="6449" t="3458" r="7810" b="3588" alignment="justified" li="2088" spaceBefore="33" spaceAfter="125" lsp="exactly" lspExact="207" language="en"> 
<ln l="6449" t="3458" r="7810" b="3588" baseLine="3586" underlined="none" subsuperscript="none" fontSize="900" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="0" foreColor="0c0c0c"> 
<wd l="6449" t="3458" r="7042" b="3588">GREAT</wd> 
<space/> 
<wd l="7092" t="3463" r="7810" b="3586">BRITAIN</wd> 
</ln> 
</para> 
</dd> 
<dd l="139" t="266" r="689" b="962"> 
<picture l="139" t="413" r="689" b="962" alignment="left" spaceBefore="147"> 
</picture> 
</dd> 
<dd l="139" t="2279" r="2508" b="3762"> 
<para l="149" t="2302" r="2105" b="2424" alignment="justified" lsp="exactly" lspExact="185" language="en"> 
<ln l="149" t="2302" r="2105" b="2424" baseLine="2422" bold="true" underlined="none" subsuperscript="none" fontSize="800" fontFace="Times New Roman" fontFamily="roman" fontPitch="variable" spacing="16" foreColor="0c0c0c"> 
<wd l="149" t="2302" r="518" b="2422">VAT</wd> 
<space/> 
<wd l="574" t="2304" r="833" b="2424">No:</wd> 
<space/> 
<wd l="1054" t="2302" r="2105" b="2424">GB530000000</wd> 
</ln> 
</para> 
+2

Можете ли вы показать пример входного XML? Использует ли это какие-либо пространства имен? –

ответ

2
<document xmlns="http://www.scansoft.com/omnipage/xml/ssdoc-schema3.xsd" 

Эта декларация помещает все имена элементов не-приставкой в ​​документе в пространство имен, поэтому вам необходимо назначить префикс для этого пространства имен в XSLT, а затем использовать префикс в вашем XPath выражений:

<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"> 

    <!-- ... --> 
    <td><xsl:value-of select="/ss:document/ss:page/ss:body/ss:dd[1]/ss:dd[1]/ss:dd/ss:table/ss:cell[1]/ss:para[1]/ss:ln[1]/ss:wd[3]" /></td> 

Это потому, что префиксы имена узлов в выражении XPath 1.0 всегда относятся к узлам, которые не в пространстве имен.

Не связанный с этим, я бы лично избегал использования выражения XPath, которое так сильно связано с точным расположением XML-документа с точки зрения «третьего wd первого ln of ....» - вы могли бы вместо этого использовать что-то вроде

<xsl:value-of select="//ss:wd[preceding-sibling::ss:wd[2] = 'VAT'] 
          [preceding-sibling::ss:wd[1] = 'No:']" /> 

специфический таргетинг wd которого два предшествующих wd S являются «НДС» и «Нет:» везде, где это происходит, происходит.

+0

«Это объявление помещает все имена без префикса в документе в пространство имен, поэтому вам нужно назначить префикс для этого пространства имен в XSLT, а затем использовать префикс в выражениях XPath» Как его изменить что мне не нужно это делать? – Dan

+0

@ Если вы не можете использовать XSLT (1.0), вам нужно будет отредактировать входной файл XML, чтобы удалить декларацию пространства имен. Если у вас был доступ к XSLT 2.0, вы могли бы использовать 'xpath-default-namespace', но это недоступно в 1.0 (учитывая использование'

+0

У меня есть возможность редактировать входной файл XML. Это так же просто, как добавление дополнительной строки в начале? – Dan

Смежные вопросы