在 schematron 中使用 for-each 循环

问题描述

我是自学成才,所以我提前为我所有的错误道歉。

我的 xml 包含 50 个 testwithstate 元素,每个元素都包含一个 ID 属性。我一直无法运行 for-each 循环,我试图创建一个尽可能简单的测试来找出我的错误,但没有成功。我的代码如下。在此先感谢您提供的任何帮助。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" queryBinding="xslt2" xmlns:sqf="http://www.schematron-quickfix.com/validator/process">
 <ns uri="http://www.w3.org/1999/xlink" prefix="xlink"/>
 <ns prefix="xs" uri="http://www.w3.org/2001/XMLSchema"/>
 
 <pattern>
  <rule context="testwithstate">
   <xsl:for-each select="/@id">
    <report test="1=1">It ran.</report>
   </xsl:for-each>
  </rule>
 </pattern>

</schema>

解决方法

我在 schematron 中写了很多,当我需要高级 xsl 代码来运行时,我将它分开来运行,这样你就可以充分利用两者。我给你举个例子。 这段代码对你来说可能没有多大意义,它是一个片段,但它向你展示了一种混合 schematron 和 xslt 的方法:

<?xml version="1.0" encoding="UTF-8"?>
<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<sch:pattern id="TPOD0470" is-a="abstractPatternWarning">
        <sch:param name="CONDITION" value="string-length(foo:foutenTPOD_0470(.)[1]) = 0"/>
</sch:pattern>
    
    <xsl:function name="foo:foutenTPOD_0470">
        <xsl:param name="context" as="node()"/>
        <xsl:for-each select="$context/../tekst:Titel">
            <xsl:if test="$context/@eId=@eId and not(starts-with(tekst:Kop/tekst:Nummer,concat($context/../tekst:Kop/tekst:Nummer,'.')))">
                <xsl:value-of select="@eId"/>
            </xsl:if>
        </xsl:for-each>
    </xsl:function>
</sch:schema>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...