具有不同命名空间前缀的 XPath 导航
XPath navigation with varying namespace-prefixes
我目前正在努力解决 XSL-FO 样式表中 XML 输入的 XPath 匹配问题。根 XML 可以有一个不同的名称空间前缀(在这个例子中 ns1
,但可以随时更改为其他内容并且无法控制)。我拥有的唯一信息是名称空间(在我的示例中 http://www.foo.com/foo1
)。
XML 输入
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:letter xmlns:ns1="http://www.foo.com/foo1" xmlns:ns2="http://www.foo.com/foo2">
<surname>Doe</surname>
<givenname>John</givenname>
...
</ns1:letter>
XSL-FO 样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" xpath-default-namespace="http://www.foo.com/foo1">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<fo:root>
...
<!-- this does not match !!! -->
<xsl:value-of select="/letter/surname"/>
...
</fo:root>
</xsl:template>
</xsl:stylesheet>
在您的 XML 中,letter
在命名空间中,但 surname
不在。通过在 XSLT 中使用 xpath-default-namespace
,您假设 xpath 中的所有无前缀元素都在该名称空间中。
您可以做的是使用前缀显式声明命名空间。前缀不必匹配 XML,它完全是任意的。它是必须匹配的命名空间 URL 才能工作
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:foo="http://www.foo.com/foo1">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<fo:root>
<xsl:value-of select="/foo:letter/surname"/>
</fo:root>
</xsl:template>
</xsl:stylesheet>
我目前正在努力解决 XSL-FO 样式表中 XML 输入的 XPath 匹配问题。根 XML 可以有一个不同的名称空间前缀(在这个例子中 ns1
,但可以随时更改为其他内容并且无法控制)。我拥有的唯一信息是名称空间(在我的示例中 http://www.foo.com/foo1
)。
XML 输入
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:letter xmlns:ns1="http://www.foo.com/foo1" xmlns:ns2="http://www.foo.com/foo2">
<surname>Doe</surname>
<givenname>John</givenname>
...
</ns1:letter>
XSL-FO 样式表
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" xpath-default-namespace="http://www.foo.com/foo1">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<fo:root>
...
<!-- this does not match !!! -->
<xsl:value-of select="/letter/surname"/>
...
</fo:root>
</xsl:template>
</xsl:stylesheet>
在您的 XML 中,letter
在命名空间中,但 surname
不在。通过在 XSLT 中使用 xpath-default-namespace
,您假设 xpath 中的所有无前缀元素都在该名称空间中。
您可以做的是使用前缀显式声明命名空间。前缀不必匹配 XML,它完全是任意的。它是必须匹配的命名空间 URL 才能工作
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:foo="http://www.foo.com/foo1">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<fo:root>
<xsl:value-of select="/foo:letter/surname"/>
</fo:root>
</xsl:template>
</xsl:stylesheet>