Pet*_*nes 3 xslt xpath default namespaces transform
我有一组XML文件,我正在使用XSL转换处理.它们有一个默认的命名空间,所以我的XSL转换必须包含声明:
XPath的默认名称空间= "瓮:CZ-RVV-IS-VAV-XML-NS:数据1.2.2"
问题是这个值不时变化,我的变换突然停止工作,直到我从新文件中查看一个例子,提取这个命名空间ID并将其放入变换中,从而转换停止对旧文件起作用.有没有办法将其作为参数传递,或者在运行时以某种方式设置它?我已经尝试了在各种教程中查找的参数语法,但没有一个适用于此特定用途.
我搜索了各种各样的论坛,发现了对XSL的命名空间不可知编码的引用,但没有弄清楚如何去做.Ian Williams的书"XSLT和Xpath"声明必须声明默认命名空间,或者输出流中没有任何内容,这就是它对我有用的方式.但是我真的不想经常手工改变这个,我想给用户一些有用的东西,而不需要我的关注.
到目前为止,我发明的唯一100%可靠的方法是使用标准编程语言将XML源和XSL转换作为文本文件打开,从XML源提取URI,将其粘贴到XSL转换中,关闭两个文件和然后,最后运行实际的转换.这很有效,但令人难以置信的是,至少根据我的口味.如何更好地处理更改默认命名空间?
皮特
xpath-default-namespace的值必须是静态URI,因此如果希望样式表发生变化,则必须预先处理样式表.一种方法是使用XSLT.每次将以下元样式表应用于主样式表,然后调用预处理结果.
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- Pass in the new namespace URI as a stylesheet parameter -->
  <xsl:param name="new-uri" required="yes"/>
  <!-- By default, copy everything as is -->
  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>
  <!-- But update the value of @xpath-default-namespace -->
  <xsl:template match="@xpath-default-namespace">
    <xsl:attribute name="{name()}" namespace="{namespace-uri()}">
      <xsl:value-of select="$new-uri"/>
    </xsl:attribute>
  </xsl:template>
</xsl:stylesheet>
这是一个奇怪的用例,因为命名空间并没有真正设计成如此动态.它们旨在限定名称,即构成名称的一部分.当你以这种方式看待它时,动态命名空间并没有多大意义.想象一下,数据库的表和字段名称每隔一段时间就会随意更改,这会迫使您重写所有SQL脚本以跟上更改.这就是类似的东西.