Xslt 具有不同名称空间前缀的XPath导航

Xslt 具有不同名称空间前缀的XPath导航,xslt,xsl-fo,apache-fop,Xslt,Xsl Fo,Apache Fop,我目前正在努力解决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/f

我目前正在努力解决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>
<?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>

雌鹿
约翰
...
XSL-FO样式表

<?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>
<?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中,
字母
在名称空间中,而
姓氏
不在名称空间中。通过在XSLT中使用
xpath默认名称空间
,可以假定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>