2013-04-25 49 views
0

是否可以更普遍地编写此测试。我已经坐了好几个小时了,我不知道:D。一般可以写这个吗? XPATH 2.0

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

回答

0

在你的规则和你的实例文档来看,我强烈怀疑,你不希望有一个“包含”试验,而是一个“= “测试。人们经常想象英文短语“属性包含值”应该翻译为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'

+0

我正在读你的书这是awsome :)我会用它来写我的学士论文。 – James 2013-08-11 15:35:34

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