我有这个自由格式的xml(没有dtd,只有mystuff
用于虚拟命名空间)。
问题是我的select语句没有找到元素。这是一个xpath问题吗?命名空间?
<document xmlns="http://mystuff.org">
<Chapter>
<arg name="title">title is here</arg>
</Chapter>
</document>
使用此xslt:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://mystuff.org">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<newdoc>
<heading>
<xsl:text>hey</xsl:text>
<xsl:value-of select='/document/Chapter/arg' />
<xsl:text>hey</xsl:text>
</heading>
</newdoc>
</xsl:template>
</xsl:stylesheet>
和结果,使用xsltproc
:
<?xml version="1.0"?>
<newdoc xmlns="http://mystuff.org">
<heading>heyhey</heading>
</newdoc>
答案 0 :(得分:2)
设置
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:p="http://mystuff.org">
并使用名称空间前缀
<xsl:value-of select='/p:document/p:Chapter/p:arg' />
导致
<heading>heytitle is herehey</heading>
答案 1 :(得分:1)
如果省略伪名称空间声明,它应该产生(假定的)预期输出:
<newdoc>
<heading>heytitle is herehey</heading>
</newdoc>
如果要保留虚拟名称空间声明,可以在所有xpath表达式之前放置*:
以匹配空名称空间:
<xsl:template match="*:document">
<newdoc>
<heading>
<xsl:text>hey</xsl:text>
<xsl:value-of select="/*:document/*:Chapter/*:arg"/>
<xsl:text>hey</xsl:text>
</heading>
</newdoc>
</xsl:template>
或者,如果您也可以使用XSLT 2.0,则可以在xpath-default-namespace="http://mystuff.org"
中使用xsl:stylesheet
。