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

2 回答 2

0

使用

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
于 2013-04-25T03:36:13.137 回答
0

查看您的规则和您的实例文档,我强烈怀疑您不想要“包含”测试,而是想要“=”测试。人们经常认为英文短语“attribute contains value”应该翻译成 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'

于 2013-04-25T15:48:48.400 回答