Можно ли вообще это написать? ПУТЬ 2.0

Можно ли написать этот тест в более общем виде. Я сидел над этим часами и не могу понять: D.

 <pattern>
            <title>Pravidla pro měnu(CZK/USD)</title>
            <rule context="/o:objednávka/o:položky">
                <report test="(contains(o:položka[1]/o:cena/@měna,'CZK') and 
                    contains(o:položka[2]/o:cena/@měna,'USD'))or(contains(o:položka[2]/o:cena/@měna,'CZK') and 
                    contains(o:položka[1]/o:cena/@měna,'USD'))">V objednávce 
                    musí být jen jedna měna.</report>     
            </rule>

XML-документ

   <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="cssTrans.css" type="text/css" ?>
<?xml-model href="objednavka.sch" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?>
<objednávka xmlns="urn:x-eshop:document-schemas:purchase-order">
    <položky>
        <položka kód="a">
            <název>Sekačka na trávu</název>
            <počet mj="ks">1</počet>
            <cena měna="USD">0.9</cena>
            <popis>http://example.org/sekacka.html</popis>
        </položka>
        <položka kód="d">
            <název>Travní semeno</název>
            <počet mj="kg">2.5</počet>
            <cena měna="CZK">18001</cena>
        </položka>
    </položky>
</objednávka>

person James    schedule 25.04.2013    source источник


Ответы (2)


Глядя на ваше правило и ваш экземпляр документа, я сильно подозреваю, что вам нужен не тест «содержит», а скорее тест «=». Люди часто думают, что английская фраза «атрибут содержит значение» должна переводиться как XPath contains(@att, 'val'), но это неправильно; должно быть @att = 'val'.

Я думаю, что ограничение, которое вы пытаетесь выразить, заключается в том, что есть два элемента položka, и в одном из них атрибут cena/@měna имеет значение USD, а в другом — значение CZK. Я бы выразил это как

o:položka/o:cena/@měna ='CZK' and o:položka/o:cena/@měna = 'USD'

помня, что в XPath "=" является экзистенциальным: a/b/c='USD' означает, что по крайней мере один узел, выбранный a/b/c, имеет значение 'USD'.

person Michael Kay    schedule 25.04.2013
comment
Я читаю вашу книгу, она потрясающая :) Я собираюсь использовать ее для написания дипломной работы бакалавра. - person James; 11.08.2013

Использование:

contains('USD|CZK|USD', string-join(o:položka/o:cena/@měna, '|'))

Проверка на основе XSLT 2.0:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:o="urn:x-eshop:document-schemas:purchase-order">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/o:objednávka/o:položky">
  <xsl:sequence select=
  "contains('USD|CZK|USD', string-join(o:položka/o:cena/@měna, '|'))"/>
 </xsl:template>
</xsl:stylesheet>

Когда это преобразование применяется к предоставленному XML-документу:

<objednávka xmlns="urn:x-eshop:document-schemas:purchase-order">
    <položky>
        <položka kód="a">
            <název>Sekačka na trávu</název>
            <počet mj="ks">1</počet>
            <cena měna="USD">0.9</cena>
            <popis>http://example.org/sekacka.html</popis>
        </položka>
        <položka kód="d">
            <název>Travní semeno</název>
            <počet mj="kg">2.5</počet>
            <cena měna="CZK">18001</cena>
        </položka>
    </položky>
</objednávka>

выражение XPath оценивается, и результат этой оценки копируется в выходные данные:

true

Если в этом XML-документе оценивается одно и то же выражение:

<objednávka xmlns="urn:x-eshop:document-schemas:purchase-order">
    <položky>
        <položka kód="a">
            <název>Sekačka na trávu</název>
            <počet mj="ks">1</počet>
            <cena měna="USD">0.9</cena>
            <popis>http://example.org/sekacka.html</popis>
        </položka>
        <položka kód="d">
            <název>Travní semeno</název>
            <počet mj="kg">2.5</počet>
            <cena měna="USD">18001</cena>
        </položka>
    </položky>
</objednávka>

затем снова выдается правильный результат:

false
person Dimitre Novatchev    schedule 25.04.2013