Xslt 使用xsl命名空间别名时如何处理命名空间版本问题
我有一个xslt文件,看起来像: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
<?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:
仅与同一命名空间关联使用someName
)引用为:
在极少数情况下,您可能在此命名空间中有属性名称(不建议使用属性):
我的首选方法是预处理文档(通常,使用另一个XSLT转换),以便它们使用一致的名称空间。预处理样式表非常简单,这样做可以避免主样式表被大量复杂的条件代码弄乱。此外,预处理代码变得完全可重用;您可以在任何管道中使用它 如果您需要更高的性能,可以在插入XML解析器和转换器之间的SAX过滤器中进行预处理,这样几乎不需要任何成本 (我还建议人们避免将版本信息打包到名称空间URI中,但这并不能告诉Microsoft…如果这对您有用,请查看此内容。
*[starts-with(name(), 'mm:')]
@*[starts-with(name(), 'mm:')]