在处理XSL转换的服务器上禁用了命名空间检查(因为编写XSL的人不了解命名空间).我必须对XSL进行更改,但我无法测试它,因为没有定义任何名称空间,即.
代替
<xsl:template match="ns:element[position()=1]">...
它有
<xsl:template match="element[position()=1]">...
所以它与XML中的任何元素都不匹配,因为它们都是使用命名空间限定的.
我无法在服务器上进行测试,因为我无法访问它.修复XSL是没用的,因为必须启用名称空间检查,这将打破所有其他转换.
所以我需要做的是找到一种在XSL转换期间忽略命名空间的方法.我可以访问MSXML,XMLSpy(在这里找不到选项),如果我真的需要,我可以使用C#或类似语言编写代码.
作为最后的手段,我可以编写一些正则表达式,但我真的不想走这条路,特别是在处理XML时…
它是一个Windows 2003虚拟服务器,运行一个Methode Servlet实例(www.eidosmedia.com).我不知道这个servlet用于执行XSL转换的技术.他们忽略了命名空间,因为最初编写XSL的人不理解它们,并且没有将它们包含在XSL中.所以现在所有的XSL文件(数百个)都没有名称空间.
将所有这些文件一次性修复可能是一个有趣的挑战,但这不是我现在所需要的(并且由于涉及的测试数量,部门经理无论如何都不会同意它).我想知道的是,是否有可用的工具(或技术)允许我按原样获取这些XSL文件,并使用它们转换相应的XML文档而不考虑命名空间.在我看来,必须存在一个工具,因为编写原始XSL的人必须使用类似的东西来自己测试转换.
您可以执行转换以在“实际”转换之前从输入中删除所有命名空间.但是……我不确定你是否应该这样做.感觉很难看.
原文链接:https://www.f2er.com/xml/292457.html<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="*"> <xsl:element name="{local-name()}" > <xsl:apply-templates select="@*|node()"/> </xsl:element> </xsl:template> <xsl:template match="@*"> <xsl:attribute name="{local-name()}"> <xsl:value-of select="." /> </xsl:attribute> </xsl:template> </xsl:stylesheet>
原始答案:
这是一个选择吗?
<xsl:template match="*[local-name()='element' and position()=1]">...
(正如评论所示 – 它不会)