Альтова и Куктоп разный результат - PullRequest
1 голос
/ 11 мая 2011

У меня есть таблица поиска из этой таблицы, мы берем результат, если customeritemcode = substring (поле [@ id = '0'], 11,3), тогда подсемейство = подсемейство из таблицы поиска, в противном случае '9':

<lookup>
    <Code>
        <BuyerItemCode>439</BuyerItemCode>
        <Subfamily>016</Subfamily>          
    </Code>
</lookup>   

XML-файл выглядит так:

<document>
    <line id="14">
        <field id="0"><![CDATA[MMM4443 419280600000]]></field>
    </line>
    <line id="15">
        <field id="0"><![CDATA[MMM4443 414390600000]]></field>
    </line>
</document>

Мне нужно сравнить эти данные с lookup.xml, и если данные не сравниваются, вставьте константу 9. С altova v11 моя программа работает, с cooktop нет, яПодлое сравнение ложно.Моя программа выглядит так:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:date="http://exslt.org/dates-and-times" xmlns:exsl="http://exslt.org/common" extension-element-prefixes="date exsl">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:key name="ProdSubfamily" match="Subfamily" use="../BuyerItemCode"/>
    <xsl:template match="/">
        <Interchange>
            <Group>
                <Message>
                    <xsl:if test="/document/line[(substring(field[@id='0'], 1,3)='MMM')]">
                        <xsl:apply-templates mode="MMM" select="/document"/>
                    </xsl:if>
                </Message>
            </Group>
        </Interchange>
    </xsl:template>
    <xsl:template mode="MMM" match="/document">
        <PriceCatalogue-Lines>
            <xsl:for-each select="/document/line[contains(substring(field[@id='0'], 1,3),'MMM') and not(contains(substring(field[@id='0'],9,1),'0'))]">
                <xsl:variable name="inputProd" select="substring(field[@id='0'], 11,3)"/>
                <Line>
                    <Line-Item>
                        <LineNumber>
                            <xsl:value-of select="position()"/>
                        </LineNumber>
                        <BuyerItemCode>
                            <xsl:value-of select="substring(field[@id='0'], 11,3)"/>
                        </BuyerItemCode>
                        <SubFamily>
                            <xsl:choose>
                                <xsl:when test="substring(field[@id='0'], 11,3) = document('lookup.xml')/*/*/BuyerItemCode">
                                    <xsl:for-each select="document('lookup.xml')">
                                        <xsl:for-each select="key('ProdSubfamily',$inputProd)">
                                            <xsl:value-of select="."/>
                                        </xsl:for-each>
                                    </xsl:for-each>
                                </xsl:when>
                                <xsl:otherwise>
                                    <xsl:value-of select="'9'"/>
                                </xsl:otherwise>
                            </xsl:choose>
                        </SubFamily>
                    </Line-Item>
                </Line>
            </xsl:for-each>
        </PriceCatalogue-Lines>
    </xsl:template>
</xsl:stylesheet>

Правильный результат, который я получаю с помощью Altova, и я хочу получить этот результат с помощью cooktop:

<Interchange>
    <Group>
        <Message>
            <PriceCatalogue-Lines>
                <Line>
                    <Line-Item>
                        <LineNumber>1</LineNumber>
                        <BuyerItemCode>928</BuyerItemCode>
                        <SubFamily>9</SubFamily>
                    </Line-Item>
                </Line>
                <Line>
                    <Line-Item>
                        <LineNumber>2</LineNumber>
                        <BuyerItemCode>439</BuyerItemCode>
                        <SubFamily>016</SubFamily>
                    </Line-Item>
                </Line>
            </PriceCatalogue-Lines>
        </Message>
    </Group>
</Interchange>

ПЛОХОЙ результат, который я получаю с помощью Cooktop:

<Interchange>
<Group>
<Message>
<PriceCatalogue-Lines>
<Line>
<Line-Item>
<LineNumber>1</LineNumber>
<BuyerItemCode>928</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
<Line>
<Line-Item>
<LineNumber>2</LineNumber>
<BuyerItemCode>439</BuyerItemCode>
<SubFamily>9</SubFamily>
</Line-Item>
</Line>
</PriceCatalogue-Lines>
</Message>
</Group>
</Interchange>

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Проблема в исходном XML-документе :

В разделах CDATA содержится ненужный символ [, и это первый символ текстового узла.Это означает, что:

substring(field[@id='0'], 1,3)='MMM'

всегда false()

Решение :

Заменить :

<field id="0"><![CDATA[[MMM4443 419280600000]]></field>

с :

<field id="0"><![CDATA[MMM4443 419280600000]]></field>

Также замените :

<field id="0"><![CDATA[[MMM4443 414390600000]]></field>

на

<field id="0"><![CDATA[MMM4443 414390600000]]></field>

Теперь, независимо от используемого процессора XSLT (у меня дома их 9, и я могу запустить его на 8 из них: MSXML3 / 4, .NET XslCompiledTransform и XslTransform, AltovaXML, Saxon 6.5.4, Saxon 9.1.05 и XQSharp), результат преобразования - это то, что, я думаю, вы хотели :

<Interchange>
  <Group>
    <Message>
      <PriceCatalogue-Lines>
        <Line>
          <Line-Item>
            <LineNumber>1</LineNumber>
            <BuyerItemCode>928</BuyerItemCode>
            <SubFamily>9</SubFamily>
          </Line-Item>
        </Line>
        <Line>
          <Line-Item>
            <LineNumber>2</LineNumber>
            <BuyerItemCode>439</BuyerItemCode>
            <SubFamily>016</SubFamily>
          </Line-Item>
        </Line>
      </PriceCatalogue-Lines>
    </Message>
  </Group>
</Interchange>

Я предполагаю, что процессору Cooktop XSLT требуется некоторая конфигурация, чтобыВключено выполнение функции document() - изучите доступную документацию, как это сделать.

0 голосов
/ 12 мая 2011

Петрас, вывод, который вы видите, может означать, что процессор XSLT не может найти файл lookup.xml.

Поскольку вы используете относительный URL ('lookup.xml'), знаете ли вы, что такое базовый URL? Другими словами, относительно чего?

По умолчанию я считаю, что базовый URL-адрес используется для таблицы стилей. Если вы передадите второй аргумент в document (), вы можете явно указать базовый URL. E.g.:

document('lookup.xml', /)

будет искать 'lookup.xml' относительно входного XML-файла.

Вы можете решить проблему или, по крайней мере, выяснить, является ли эта проблема , указав абсолютный URL-адрес для lookup.xml. Почему бы вам не попробовать это, и дайте нам знать, если это работает Э.Г.

document('/home/lars/lookup.xml')

или

document('file:///c:/temp/lookup.xml')

P.S. XML Cooktop был отличным программным обеспечением, но он, кажется, довольно старый и сейчас явно не поддерживается. Это становится проблемой, когда появляются глюки. Возможно, вы захотите попробовать другие инструменты XSLT, такие как OxygenXML или StylusStudio, которые все еще поддерживаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...