代码之家  ›  专栏  ›  技术社区  ›  Wim ten Brink

检测XML文件是否包含特定命名空间

  •  1
  • Wim ten Brink  · 技术社区  · 15 年前

    <xsl:if test="count(//xsl:template)!=0">
    

    它确实检测样式表。但是,在生成XML文件时存在问题“ 未定义的命名空间前缀-“xsl”


    一些附加信息:这是一个样式表,用于分析其他XML文件,不管它们包含什么。它应该能够自我转换甚至,而且做得很好。转换其他(普通)样式表也没有问题。当我试图转换一个常规的XML文件时,问题就来了。但并非所有的XML文件。。。


    事实证明,错误是另一回事。我试图转换的XML文件包含一个处理指令。这个: <?xml-stylesheet href="..\MyStylesheet.xsl" type="text/xsl"?>

    3 回复  |  直到 15 年前
        1
  •  1
  •   Mads Hansen    15 年前

    仔细检查你是如何申报 xsl

    你需要确保 xsl 如果要在XPATH表达式中使用名称空间前缀,则在样式表中定义它。

    如果它没有在样式表中的任何位置声明(通常在文档元素上,如下所示: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> xslt “就像这样: xmlns:xslt="http://www.w3.org/1999/XSL/Transform" “它不会知道你指的是什么。

    你可以申报 xsl 你的 if 作为快速测试的陈述:

    <xsl:if test="count(//xsl:template)!=0" 
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    

    样式表?

    xsl:template 而不是评估 count() 他们中的一员。结果 test="//xsl:template" 将评估为 true() false() 如果没有选择任何内容。

    在样式表中 xsl:template 是文档元素的子级的顶级构造。而不是使用 //

    <xsl:if test="/*/xsl:template" />
    
        2
  •  1
  •   Dimitre Novatchev    15 年前

    假设XSLT代码文件始终包含 <xsl:template> .

    有一些XSLT样式表模块的例子,其中文件只包含 <xsl:stylesheet> 指令和一个或多个全局级变量。这种样式表模块通常使用 <xsl:import> <xsl:include> 说明。

    另外,定义XSLT的不是构成XSLT指令的元素的前缀 "xsl" 一些程序员使用不同的前缀,比如 "xslt" "x" .

    真正定义XSLT代码的是XSLT名称空间 .

    最后,XSLT代码文件甚至不能保证包含 < 指令 ,因为XSLT提供了一个同义词: <xsl:transform> .

    考虑到所有这些因素,更好的测试方法是:

    /*[contains('|stylesheet|transform|', concat('|', local-name(), '|')
              and
                namespace-uri()="http://www.w3.org/1999/XSL/Transform"
               )
    

    因为有可能 embedded stylesheets ,上述测试可稍作修改,以涵盖以下内容:

    //*[contains('|stylesheet|transform|', concat('|', local-name(), '|')
              and
                namespace-uri()="http://www.w3.org/1999/XSL/Transform"
               )
    
        3
  •  0
  •   AbuNassar    15 年前

    只有