XSLT获取文本

时间:2015-06-15 21:20:37

标签: xml xslt

我试图从某个位置遍历文档中包含文本的所有节点。

<xsl:template name="interpret_text">
  <xsl:param name="location"/>
  <xsl:for-each select="$location//text()">
    <xsl:choose>
      <xsl:when test="name(.) = tag_im_looking_for">
        <!-- various code stuff and closing tags -->

此代码功能正常,但您可能会注意到我的问题。当我进入for-each循环时,文本忘记了它的标记。 current()的值是原始文本,不再记住其所有者。我试图调整我的算法来选择节点,然后只解析那些带有文本的节点。像这样:

<xsl:template name="interpret_text">
  <xsl:param name="location"/>
  <xsl:for-each select="$location//node()">
    <xsl:if test="not(text() = '')">
      <xsl:choose>
        <xsl:when test="name(.) = tag_im_looking_for">
          <!-- various code stuff and closing tags -->

然而不知何故,这个算法对我来说是个问题。假设下面的xml没有需要规范化的额外空格。

<a>
  <b>
  before
    <c>inner text</c>
  after 
  </b>
</a>

Top algorthim将按此顺序运行。

before
inner text
after

底部将按此顺序运行

b context
c context

但是在c上下文之前和之后都有文本,我需要在&#34;之前解析&#34;然后在&#34;内部文本&#34;之后解析&#34;然后在&#34;之后#34; ;。注意我需要这个算法适用于任何深度,有或没有&#34;之前&#34;或&#34;之后&#34;文本。是否有简单的方法从节点解决方案或文本解决方案获得我想要的结果?

2 个答案:

答案 0 :(得分:0)

我不清楚我的位置是什么,但是这个样本:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output indent="yes"/>
<xsl:template match="/">
    <sample>        <xsl:call-template name="interpret_text">
        <xsl:with-param name="location" select="."/>
    </xsl:call-template>
    </sample>

</xsl:template>
<xsl:template name="interpret_text">
    <xsl:param name="location"/>
    <xsl:for-each select="$location//text()">
        <xsl:if test="string-length(normalize-space(.))>0">
        <elem>
            Parent: <xsl:value-of select="name(parent::*)"/>, Text: <xsl:value-of select="normalize-space(.)"/>
        </elem>
        </xsl:if>
    </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

将使用您的输入样本产生此输出:

<sample>
  <elem>
            Parent: b, Text: before</elem>
  <elem>
            Parent: c, Text: inner text</elem>
  <elem>
            Parent: b, Text: after</elem>
</sample

所以你可以得到父:: *并使用它的名字来做你想做的事。

答案 1 :(得分:0)

我不得不猜测一下你的实际需求,但这应该非常接近。

样式表:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/root">
    <output>
      <xsl:apply-templates match="foo"/>
    </output>
  </xsl:template>
  <xsl:template name="interpret-text">
    <xsl:for-each select=".//interesting-tag[text()]">
      <xsl:value-of select="text()"/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

文件:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="style.xslt"?>
<root>
  <foo>
    <bar>
      <interesting-tag>
        Hello
      </interesting-tag>
      <interesting-tag>
        World
      </interesting-tag>
    </bar>
    <interesting-tag>
      o11c was here
    </interesting-tag>
  </foo>
</root>