Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT1.0能否在select子句中的xmlns属性上使用变量?_Xml_Variables_Xslt_Namespaces_Xslt 1.0 - Fatal编程技术网

XSLT1.0能否在select子句中的xmlns属性上使用变量?

XSLT1.0能否在select子句中的xmlns属性上使用变量?,xml,variables,xslt,namespaces,xslt-1.0,Xml,Variables,Xslt,Namespaces,Xslt 1.0,我试图理解XSLT1.0脚本是否可以与具有相似但不相等模式(共享相同名称空间前缀)的xml文件一起重用 变量ns uri包含所需的名称空间,但XSLT 1.0似乎无法识别xmlns中的这种用法:emp='$ns uri',尽管将同一属性与具有名称空间的字符串一起使用是可行的 我不想遵循使用构造*[name='emp:department']的建议,因为这会使xslt完全不可读 还有什么建议吗?这是XSLT1.0的最终限制吗 注意:由于我使用前缀,中的答案不适用 多谢各位 示例代码 以下操作不起作

我试图理解XSLT1.0脚本是否可以与具有相似但不相等模式(共享相同名称空间前缀)的xml文件一起重用

变量ns uri包含所需的名称空间,但XSLT 1.0似乎无法识别xmlns中的这种用法:emp='$ns uri',尽管将同一属性与具有名称空间的字符串一起使用是可行的

我不想遵循使用构造*[name='emp:department']的建议,因为这会使xslt完全不可读

还有什么建议吗?这是XSLT1.0的最终限制吗

注意:由于我使用前缀,中的答案不适用

多谢各位

示例代码 以下操作不起作用:


您看到的问题是由不同的名称空间引起的:

xml将emp命名空间定义为xmlns:emp=http://www.example.com/ns/employee/2006 xml将emp命名空间定义为xmlns:emp=http://www.example.com/ns/employee/2012 因此,在一种情况下,您的模板将失败,因为它的规则由于不同的名称空间前缀而不匹配…2006!=。。。2012年

因此,要创建忽略名称空间的模板,必须忽略名称空间前缀。 这是通过只考虑元素名称的本地名称而不是整个名称来实现的

例如,命名空间元素的名称可以是emp:first。 所以name会返回emp:first,localname只会返回first

在本例中,忽略名称空间前缀emp是通过只关注所有相关元素的本地名称来实现的

因此,以下模板由

使用* 并通过使用谓词[local name='…']来限制这组元素,该谓词检查本地名称匹配的元素 整个模板如下所示

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="*[local-name() = 'employee']">
        First Name "<xsl:value-of select="*[local-name() = 'first']" />"
        Last Name  "<xsl:value-of select="*[local-name() = 'last']" />
        Department "<xsl:value-of select="*[local-name() = 'department']" />"
    </xsl:template>

</xsl:stylesheet>

并为两个XML输入文件返回相同的结果。

否,不能将前缀绑定到变量URI

然而,前缀本身并不重要——只有URI重要。如果您知道预期的命名空间URI是什么,则可以将它们各自绑定到自己的前缀,并同时使用这两个前缀,例如:

XSLT1.0

另一个选项是从传入XML中获取名称空间URI开始,就像您开始做的那样,并使用它生成XSLT样式表,其中常量前缀绑定到提取的URI

然后将生成的样式表应用于原始XML,以获得最终结果

<?xml version="1.0"?>
<emp:root xmlns:emp="http://www.example.com/ns/employee/2006">
    <emp:employee status="Guru">
        <emp:first>John</emp:first>
        <emp:last>Kane</emp:last>
        <emp:department>IT</emp:department>
        <emp:country>IE</emp:country>
    </emp:employee>
</emp:root>
<?xml version="1.0"?>
<emp:root xmlns:emp="http://www.example.com/ns/employee/2012">
    <emp:employee status="Guru">
        <emp:first>John</emp:first>
        <emp:last>Kane</emp:last>
        <emp:department>IT</emp:department>
        <emp:country>IE</emp:country>
    </emp:employee>
</emp:root>
First Name "John"
Last Name  "Kane"
Department "IT"
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="*[local-name() = 'employee']">
        First Name "<xsl:value-of select="*[local-name() = 'first']" />"
        Last Name  "<xsl:value-of select="*[local-name() = 'last']" />
        Department "<xsl:value-of select="*[local-name() = 'department']" />"
    </xsl:template>

</xsl:stylesheet>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:emp6="http://www.example.com/ns/employee/2006"
xmlns:emp12="http://www.example.com/ns/employee/2012">
<xsl:output method="text"/>

<xsl:template match="emp6:employee | emp12:employee">
    First Name "<xsl:value-of select="emp6:first | emp12:first"/>"
    Last Name  "<xsl:value-of select="emp6:last | emp12:last" />"
    Department "<xsl:value-of select="emp6:department | emp12:department"/>"
</xsl:template>

</xsl:stylesheet>