自由格式xml中的xsl匹配元素文本

时间:2017-11-21 16:03:32

标签: xslt xpath

我有这个自由格式的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>

2 个答案:

答案 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