Xslt 使用xsl命名空间别名时如何处理命名空间版本问题

Xslt 使用xsl命名空间别名时如何处理命名空间版本问题,xslt,Xslt,我有一个xslt文件,看起来像: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:MM="http://schemas.microsoft.com/sqls

我有一个xslt文件,看起来像:

   <?xml version="1.0" encoding="utf-8"?>
   <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:msxsl="urn:schemas-microsoft-com:xslt"
      xmlns:MM="http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09"
      xmlns:RE="http://schemas.microsoft.com/sqlserver/RelationalEngine/Serialization/2011/09"
      xmlns:dac="urn:dacFunctions"
      exclude-result-prefixes="msxsl">
   <xsl:output method="xml" indent="yes"/>

问题是我们可能会将名称空间从
http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09 至

对于新的xml,旧的xslt不能在不更改头的情况下处理新的xml文件。我想知道我们是否可以有一种聪明的方法来允许一个xlst处理名称空间的所有版本

问题是我们可能会将名称空间从
http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09
http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/10

对于新的xml,旧的xslt无法处理新的xml文件 不更改标题。我想知道我们是否能有一个聪明的方法 允许一个xlst处理命名空间的所有版本

没有一个通用的方法,但如果存在某些限制,就有可能实现

假设

  • 属于命名空间的所有名称
    “http://schemas.microsoft.com/sqlserver/ManagementModel/Serialization/2011/09“
    前缀为
    ”mm:”

  • 前缀
    “mm:
    仅与同一命名空间关联使用

  • 您可以通过以下方式实现命名空间uri独立性

    在任何Xpath表达式中,将名称(例如
    someName
    )引用为:

    在极少数情况下,您可能在此命名空间中有属性名称(不建议使用属性):


    我的首选方法是预处理文档(通常,使用另一个XSLT转换),以便它们使用一致的名称空间。预处理样式表非常简单,这样做可以避免主样式表被大量复杂的条件代码弄乱。此外,预处理代码变得完全可重用;您可以在任何管道中使用它

    如果您需要更高的性能,可以在插入XML解析器和转换器之间的SAX过滤器中进行预处理,这样几乎不需要任何成本

    (我还建议人们避免将版本信息打包到名称空间URI中,但这并不能告诉Microsoft…

    如果这对您有用,请查看此内容。
    *[starts-with(name(), 'mm:')]
    
    @*[starts-with(name(), 'mm:')]