XPath的默认命名空间:匹配从加载XML节点没有命名空间

问题描述:

我有什么,我想通过一个XML文件来筛选我传递作为参数传递给我的XSLT 2.0撒克逊行政长官的setParameter函数文件的XML文件:XPath的默认命名空间:匹配从加载XML节点没有命名空间

xsltData = Saxon.requestXML("filter.xsl"); 
xmlData = Saxon.requestXML("xmlfile.xml"); 
var xsltProcessor = Saxon.newXSLT20Processor(xsltData); 
xsltProcessor.setParameter(null, "src", "filterxml.xml"); 
var result = xsltProcessor.transformToDocument(xmlData); 

参数XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
    <Items> 
     <Item SrcName="itemname1" NewName="newitemname1"></Item> 
     <Item SrcName="itemname2" NewName="newitemname2"></Item> 
     <Item SrcName="itemname3" NewName="newitemname3"></Item> 
    </Items> 

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xpath-default-namespace="http://www.mynamespace" 
       xmlns="http://www.mynamespace"> 

    <xsl:strip-space elements="*" /> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" name="xml" /> 

    <xsl:param name="src"></xsl:param> 
    <xsl:variable name="filter-doc" select="if (doc-available($src)) then doc($src) else()"/> 
    <xsl:variable name="Items" select="$filter-doc/Items"></xsl:variable> 
    <xsl:template match="/"> 
     <xsl:apply-templates select="$Items/Item"/> 
    </xsl:template> 
</xsl:stylesheet> 

的问题是,我有一个X XSLT文件中的路径默认名称空间,与此我不能访问$项目/项目。 如果我将名称空间xmlns =“http://www.mynamespace”添加到元素,则一切工作正常。 有没有办法让这个工作没有添加到我的parameterxml的命名空间? 我知道,在setParameter函数中,第一个参数是名称空间,但即使我在此设置了名称空间,结果中也没有任何更改。

是否有可能使用XSLT将命名空间添加到$ Items?

+0

为什么在XSLT文件中有一个xpath-default-namespace?你的样式表应该没有它。 – 2014-12-01 19:13:35

+0

因为我在我的输入xmlfile中有一个命名空间,并且如果我没有设置命名空间,它不起作用。 – 2014-12-01 19:27:29

您可以根据需要更改该设置:<xsl:variable name="Items" xpath-default-namespace="" select="$filter-doc/Items"></xsl:variable>

+0

谢谢,正是我需要的! – 2014-12-01 19:45:38

如果您需要在同一个XSLT中引用名称空间和非名称空间节点,那么您可能不应该使用xpath-default-namespace。相反,结合前缀,这个命名空间:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:my="http://www.mynamespace" 
       exclude-result-prefixes="my" 
       xmlns="http://www.mynamespace"> 

现在,您可以参考节点使用my:elementName和裸前缀的名字将参考节点http://www.mynamespace命名空间(如您的Items)不在一个命名空间。

虽然你可以在文档的不同部分xpath-default-namespace使用不同的值(该处理器将查找树和使用上的最近祖先的价值发现)这是我会亲自避免因为它很容易在重构下破解 - 例如如果您决定从模板中提取一些代码到可调用模板或xsl:function中,并且将其无意移动到xpath-default-namespace的范围之外。如果你坚持在顶层声明的前缀,那么总是清楚你在哪个表达式中指的是哪个名称空间。

+1

是的,但正如马丁所指出的那样,如果您正在处理具有不同默认命名空间的多个源文档,则可以在样式表中将xpath-default-namespace与本地作用域混合使用,以避免在任何地方使用前缀:尽管坦率地说,难以阅读的代码比如果你使用前缀宽松。 – 2014-12-02 00:33:21

+0

@MichaelKay重申你的最后一句话 - 这就是为什么我通常会避免它。 – 2014-12-03 16:23:54