0

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

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

因此,目前有以下文件:

  1. 专有工具的配置文件,转换\textbf{bold}<Cmd Name="strong"><param Nr="1">bold</param></Cmd>
  2. XSLT 文件将上面的 XML 代码转换为<myns:strong>bold</myns:strong>
  3. 描述允许的标签和格式的 XSD 文件
  4. 多个 xsl 文件,用于转换<myns:strong>bold</myns:strong>为不同的输出格式(例如返回到\textbf{bold}

维护这些文件非常困难,因为没有真正的 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>

这将更容易维护。

4

2 回答 2

4

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

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

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

如果它们是 a 的孩子<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>它们将可以通过 XPath 访问document('')/*/xsd:element(例如*是 的快捷方式xsl:stylesheet)。

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


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

于 2012-06-25T09:03:26.717 回答
4

来自除 XSLT 名称空间之外的名称空间的元素,作为 xsl:stylesheet 元素的子元素出现,将被忽略,除非它恰好是 XSLT 处理器识别的名称空间,例如,Saxon 处理器将特殊含义附加到名称空间中的元素http://saxon.sf.net/

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

于 2012-06-25T09:59:59.127 回答