混合使用XSLT,普通XML和/或可能的XSD

时间:2012-06-25 08:25:35

标签: xml xslt xsd xml-namespaces

当我将XML元素从不同的命名空间添加到XSLT文件时,是否需要预料到问题?或者他们只是被忽略了(会很棒)?

背景:在大型项目中,用户可以使用用户定义的标签进行文本格式化等等(例如\textbf{bold}。首先将它们转换为XML中的特定方言(首先使用专有工具然后使用XSLT)以及之后可能转换为其他方言,如乳胶,框架制作,BB代码......

因此,目前有以下文件:

  1. \textbf{bold}翻译为<Cmd Name="strong"><param Nr="1">bold</param></Cmd>
  2. 的专有工具的配置文件
  3. 将上面的XML代码转换为<myns:strong>bold</myns:strong>
  4. 的XSLT文件
  5. 描述允许的标签和格式的XSD文件
  6. 用于将<myns:strong>bold</myns:strong>转换为不同输出格式的多个xsl文件(例如,返回\textbf{bold}
  7. 维护这些文件非常困难,因为没有真正的1:1映射,添加新命令需要以正确的方式更改多个文件。

    因此,我的想法是合并这些。例如。单个XML文件将包含:

    <!-- config file for proprietary tool -->
    <repl:Cmd Name="strong"><repl:Param Nr="1"/></repl:Cmd>
    
    <!-- converting to XML dialect -->
    <xsl:template mode="Text" match="Cmd[@Name = 'textbf']">
       <myns:strong>
           <xsl:apply-templates select="Param[@Nr='1']" mode="Text"/>
       </myns:strong>
    </xsl:template>
    
    <!-- XSD schema for validating XML -->
    <xsd:element name="strong" type="tns:GenericTextType">
    </xsd:element>
    
    <!-- converting XML dialect to latex code -->
    <xsl:template match="myns:strong" mode="Text_toLatex">
        <xsl:text disable-output-escaping="yes">\textbf{</xsl:text>
           <xsl:apply-templates mode="Text_toLatex"/>
        <xsl:text disable-output-escaping="yes">}</xsl:text>
    </xsl:template>
    

    这将更容易维护。

2 个答案:

答案 0 :(得分:4)

  

当我将XML元素从不同的命名空间添加到XSLT文件时,是否需要预料到问题?或者他们只是被忽略了(会很棒)?

没有问题。 XSLT程序是常规XML文档,您通常可以将任何您喜欢的元素(名称空间或非名称空间)添加到文档中,它们将成为程序的一部分。

请注意,您可以在任何地方使用带有命名空间的元素,但没有命名空间的元素不能是<xsl:stylesheet>的子元素。

如果他们是<xsl:template>的孩子,他们将被输出到结果中。如果他们是<xsl:stylesheet>本身的孩子,则不输出(即,他们被“忽略”)。

你所要做的只是

  • 声明使用的命名空间,以便您的XSLT保持格式良好(这是一个基本的XML要求,您始终必须声明您使用的命名空间)
  • 使用exclude-result-prefixes指令阻止不需要的命名空间输出到结果文档中。

<xsl:stylesheet 
  version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:repl="http//tempuri.org/repl"
  xmlns:tns="http//tempuri.org/tns"
  xmlns:myns="http//tempuri.org/myns"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="tns myns"
> 
  <!-- config file for proprietary tool -->
  <repl:Cmd Name="strong"><repl:Param Nr="1"/></repl:Cmd>

  <!-- converting to XML dialect -->
  <xsl:template mode="Text" match="Cmd[@Name = 'textbf']">
    <myns:strong>
      <xsl:apply-templates select="Param[@Nr='1']" mode="Text"/>
    </myns:strong>
  </xsl:template>

  <!-- XSD schema for validating XML -->
  <xsd:element name="strong" type="tns:GenericTextType">
  </xsd:element>

  <!-- converting XML dialect to latex code -->
  <xsl:template match="myns:strong" mode="Text_toLatex">
    <xsl:text>\textbf{</xsl:text>
      <xsl:apply-templates mode="Text_toLatex"/>
    <xsl:text>}</xsl:text>
  </xsl:template>

</xsl:stylesheet>

除非您编写明确使用这些节点的XSLT代码,否则<repl:Cmd><xsd:element>不会发生任何事情。它们可以通过XP document('')/*/xsd:element访问(*xsl:stylesheet的快捷方式)。

实际上,这是在XSLT文档中存储其他结构化数据(如配置或查找表)的常用技术。


旁注:您通常不应使用disable-output-escaping。在你的特定代码中,它甚至是多余的。

答案 1 :(得分:4)

除了XSLT命名空间以外的名称空间中出现的元素(xsl:stylesheet元素的子元素)将被忽略,除非它恰好是XSLT处理器可识别的命名空间,例如Saxon处理器对元素赋予特殊含义在命名空间http://saxon.sf.net/中。

但是,不在任何名称空间中的元素是错误。