是否可以在XSLT中阅读Relax NG xml?

时间:2012-03-22 09:48:45

标签: xml xslt relaxng

我想知道是否可以使用XSLT转换Relax NG XML。请给我一些教程。

我似乎无法将下面的RelaxNG架构中的语法标记与<xsl:template match="grammar">匹配

<grammar>

  <start>
    <element name="html">
      <zeroOrMore>
        <ref name="section"/>
      </zeroOrMore>
    </element>
  </start>

  <define name="section">
    <element name="div">
      <attribute name="class"><value>section</value></attribute>
      <zeroOrMore>
        <element name="para">
          <text/>
        </element>
      </zeroOrMore>
      <zeroOrMore>
        <ref name="subsection"/>
      </zeroOrMore>
   </element>
  </define>



</grammar>

2 个答案:

答案 0 :(得分:3)

Relax NG是一种表达XML语法的语言。 W3C XML Schema也是这样一种语言。然而,XSLT是一种将XML转换为另一种数据格式的语言。换句话说,它们涵盖了不同的理由。你真的想把Relax NG转换成XSLT吗?

您可以找到一些XSLT,您可以使用这些XSLT在Relax NG homepage上相互优化,转换您的Relax NG,DTD或XML Schema。

猜测:您可能真正想到的是通过其Relax NG架构验证现有XML的工具。您可以使用any one of the validators执行此操作。

编辑,根据您的上次评论。您的xsl:template未被命中的原因很可能是因为您没有指定RelaxNG名称空间。您没有显示任何代码,但尝试将以下内容应用于样式表(请注意,名称空间前缀无关紧要,不需要在源XML文档中):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ng="http://relaxng.org/ns/structure/1.0">

    <xsl:template match="ng:grammar">
        <xsl:text>Grammar found!</xsl:text>
    </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:1)

您的意思是,我可以将Relax NG模式编译到执行模式隐含的验证的XSLT样式表中吗?

答案是,是的,理论上你可以,如果你对(a)如何将BNF语法转换为有限状态自动机的计算机科学理论有很好的理解,以及(b)如何实现有限状态函数式编程语言中的自动机。

但不知何故,我怀疑如果这是你想做的事情,那么你就不会以你的方式提出这个问题。