当我将XML元素从不同的命名空间添加到XSLT文件时,是否需要预料到问题?或者他们只是被忽略了(会很棒)?
背景:在大型项目中,用户可以使用用户定义的标签进行文本格式化等等(例如\textbf{bold}
。首先将它们转换为XML中的特定方言(首先使用专有工具然后使用XSLT)以及之后可能转换为其他方言,如乳胶,框架制作,BB代码......
因此,目前有以下文件:
\textbf{bold}
翻译为<Cmd Name="strong"><param Nr="1">bold</param></Cmd>
<myns:strong>bold</myns:strong>
<myns:strong>bold</myns:strong>
转换为不同输出格式的多个xsl文件(例如,返回\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>
这将更容易维护。
答案 0 :(得分:4)
当我将XML元素从不同的命名空间添加到XSLT文件时,是否需要预料到问题?或者他们只是被忽略了(会很棒)?
没有问题。 XSLT程序是常规XML文档,您通常可以将任何您喜欢的元素(名称空间或非名称空间)添加到文档中,它们将成为程序的一部分。
请注意,您可以在任何地方使用带有命名空间的元素,但没有命名空间的元素不能是<xsl:stylesheet>
的子元素。
如果他们是<xsl:template>
的孩子,他们将被输出到结果中。如果他们是<xsl:stylesheet>
本身的孩子,则不输出(即,他们被“忽略”)。
你所要做的只是
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/中。
但是,不在任何名称空间中的元素是错误。