【问题标题】:Check if the order of elements in xml node is correct through xslt 1.0通过xslt 1.0检查xml节点中元素的顺序是否正确
【发布时间】:2014-04-26 16:55:52
【问题描述】:

我正在通过 xslt 1.0 和 x-path 1.0 寻找解决方案。

这是一个示例 xml 文件:

<header>
<number>123</number>
<text>test string</text>
</header>

number和text都是header节点的子元素,都是该节点的可选元素。 如果数字元素不存在,我想通过 xslt 1.0 检查文本元素是在数字元素之后还是标题节点的唯一子节点。如果文本元素不存在,则同样的条件适用于数字元素。基本上我想确保元素应该出现在正确的位置。可以有更多具有相同场景的子元素。我知道 XSD 可以做到这一点,但我想在 xslt 1.0 中添加这样的检查。我还没有从我这边做任何事情。请建议我们是否可以通过 xslt 1.0 做到这一点

提前致谢。

【问题讨论】:

    标签: xpath xslt-1.0


    【解决方案1】:

    您的问题有点开放式,但我们将其解释为您想要根据内容模型验证子级序列的含义

    一个?乙? C? D?是吗?

    这是一种方法:

    <xsl:template match="header">
      <xsl:apply-templates select="*" mode="v"/>
    </xsl:template>
    
    <xsl:template match="A" mode="v">
      <xsl:if test="preceding::sibling::*"><error/></xsl:if>
    </xsl:template>
    
    <xsl:template match="B" mode="v">
      <xsl:variable name="p" select="preceding-sibling::*[1]"/>
      <xsl:if test="$p and not(name($p) = 'A')"><error/></xsl:if>
    </xsl:template>
    
    <xsl:template match="C" mode="v">
      <xsl:variable name="p" select="preceding-sibling::*[1]"/>
      <xsl:if test="$p and not(name($p) = 'A' or name($p) = 'B')"><error/></xsl:if>
    </xsl:template>
    

    等等

    【讨论】:

    • 对不起,如果我的解释不是描述性的,但你是对的,我想根据内容模型验证孩子的顺序。谢谢,我会试试你的解决方案。
    • 它不起作用,模式'v'没有在任何地方定义,但它正在使用模板头。也许我可以找到其他解决方案。感谢您的帮助。
    • 除此之外,如果有 20 个子元素,那么我必须编写 20 个模板匹配。是的,我的限制是 xslt 1.0,但应该有一个解决方案来添加这些类型的验证检查。
    • 已编辑以添加缺少的模式声明。我正在寻求一种具有最大灵活性的解决方案,而不是一种具有最大简洁性的解决方案。由于您一开始没有解释为什么要在 XSLT 而不是 XSD 中执行此操作,因此很难猜测您对一个好的解决方案的标准是什么。
    • 好吧,我正在尝试通过 xsl/xsl-fo 生成报告。我的 xsl-fo 将进行这些检查并生成可读格式的错误消息。这是我的标准。
    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多