在Schematron中测试匹配的文件名

时间:2014-06-26 21:19:16

标签: xml xpath-2.0 schematron

我有一个XML文档,其中包含xml,pdf和tif文件的列表。我需要通过Schematron测试每个xml有一个匹配的pdf文件,反之亦然。

我的XML:

<folder>
    <files>
        <file>foo.xml</file>
        <file>foo.pdf</file>
        <file>bar.xml</file>
        <!-- Missing file <file>bar.pdf</file> -->
        <file>foo.tif</file>
    </files>
</folder>

我的Schematron:

<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2">

<!-- XML/PDF Matches -->

<pattern abstract="false" id="xmlPdfPair">
    <rule context="folder/files//file">
        <assert test="substring-before(.,'.xml') eq substring-before(.,'.pdf')">The XML or PDF (<value-of select="."/>) does not have a matching PDF or XML file.</assert>
    </rule>
</pattern>

我希望规则触发应该出现在文件中的缺失bar.pdf。我的Schematron没有做到这一点。我觉得我需要一个for-each构造。使用密钥会使这更简单吗?

1 个答案:

答案 0 :(得分:1)

将其更改为提及以获得所需的验证:

  <pattern abstract="false" id="xmlPdfPair">
    <rule context="//file[contains(text(),'.xml')]">
      <let name="fileName" value="substring-before(.,'.xml')"/>
      <assert test="(following-sibling::file)[1][text()=concat($fileName,'.pdf')]">The XML or PDF
          (<value-of select="."/>) does not have a matching PDF or XML file.</assert>
    </rule>
  </pattern>