我想选择节点下的所有文本(包括节点名称)

时间:2010-05-25 01:03:33

标签: xslt xpath

我目前有一个像这样的xml文件:

<aaa>
    <b>I am a <i>boy</i></b>.
</aaa>

如何获得完整的字符串:<b>I am a <i>boy</i></b>.?感谢。

2 个答案:

答案 0 :(得分:2)

您必须告诉XSLT您也想要复制元素。这可以通过附加规则来完成。请注意,我在apply-templates元素上使用自定义选择子句来选择属性以及所有节点类型对象。另请注意,aaa的规则优先,并且将aaa元素本身复制到输出。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="aaa">
    <xsl:apply-templates select="@*|node()"/>
  </xsl:template>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

答案 1 :(得分:2)

<aaa> 
    <b>I am a <i>boy</i></b>. 
</aaa> 
     

如何获得确切的字符串:   <b>I am a <i>boy</i></b>。?

在您的情况下执行此操作的最简单/最简单方法是输出以下XPath表达式的结果

<强> /*/node()

这意味着:“选择所有顶级元素的子节点。”

当然,有一些我们不想选择的只有空格的文本节点,但是XSLT可以处理这个问题,因此XPath表达式就像上面显示的一样简单。

现在,要通过XSLT转换获得结果,我们使用以下

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
   <xsl:copy-of select="/*/node()"/>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换后,生成所需结果

<b>I am a <i>boy</i></b>.

请注意

  1. 使用<xsl:copy-of> xslt指令(不是<xsl:value-of>),复制节点,而不是字符串值。

  2. 使用<xsl:strip-space elements="*"/> XSLT指令,指示XSLT处理器忽略XML文档中任何仅限空格的文本节点。