首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一般情况下可以写这个吗?XPATH 2.0

一般情况下可以写这个吗?XPATH 2.0
EN

Stack Overflow用户
提问于 2013-04-25 01:40:32
回答 2查看 117关注 0票数 0

是否有可能更广泛地编写这个测试。我已经坐在上面好几个小时了,我弄不清楚:D。

代码语言:javascript
复制
 <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文档

代码语言:javascript
复制
   <?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>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-25 15:48:48

查看您的规则和实例文档,我强烈怀疑您不需要“包含”测试,而是需要"=“测试。人们常常认为英语短语“属性包含值”应该被翻译成XPath contains(@att, 'val'),但这是错误的,应该是@att = 'val'

我认为,您要表达的约束是,有两个položka元素,其中一个是cena/@měna属性,值是美元,而另一个元素是CZK值。我想说的是

代码语言:javascript
复制
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'

票数 0
EN

Stack Overflow用户

发布于 2013-04-25 03:36:13

使用

代码语言:javascript
复制
contains('USD|CZK|USD', string-join(o:položka/o:cena/@měna, '|'))

基于XSLT2.0的验证:

代码语言:javascript
复制
<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文档时:

代码语言:javascript
复制
<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表达式,并将计算结果复制到输出:

代码语言:javascript
复制
true

如果在此XML文档上计算相同的表达式,则为

代码语言:javascript
复制
<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>

,然后再次生成正确的结果:

代码语言:javascript
复制
false
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16205043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档