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?
您可以根据需要更改该设置:<xsl:variable name="Items" xpath-default-namespace="" select="$filter-doc/Items"></xsl:variable>
。
谢谢,正是我需要的! – 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
的范围之外。如果你坚持在顶层声明的前缀,那么总是清楚你在哪个表达式中指的是哪个名称空间。
是的,但正如马丁所指出的那样,如果您正在处理具有不同默认命名空间的多个源文档,则可以在样式表中将xpath-default-namespace与本地作用域混合使用,以避免在任何地方使用前缀:尽管坦率地说,难以阅读的代码比如果你使用前缀宽松。 – 2014-12-02 00:33:21
@MichaelKay重申你的最后一句话 - 这就是为什么我通常会避免它。 – 2014-12-03 16:23:54
为什么在XSLT文件中有一个xpath-default-namespace?你的样式表应该没有它。 – 2014-12-01 19:13:35
因为我在我的输入xmlfile中有一个命名空间,并且如果我没有设置命名空间,它不起作用。 – 2014-12-01 19:27:29