如何在同一元素下获得不同的位置内容?

时间:2010-12-15 05:38:19

标签: xml xslt xpath

我是xml和xsl的新手,如果这是一个简单的问题,如果我的术语不正确,我很抱歉。

我的问题是,“ab”和“cd”属于元素,但是在xsl中,xpath表达式“../ text()”始终指向“ab”,但不是“cd”。 有什么方法可以得到“CD”吗?非常感谢!

的xml:

<root>
ab
<CH>xxxx</CH>
cd
<CH>xxxx</CH>
</root>

的xsl:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
          xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:template match="root" >
          <xsl:apply-templates select="CH"/>

    </xsl:template>
<xsl:template match="CH" >
    <c> 
        <xsl:value-of select="../text()"/>
    </c>
</xsl:template>
</xsl:stylesheet>

目前的结果:

<?xml version="1.0"?>
<c>
ab
</c><c>
ab
</c>
欲望结果:

<?xml version="1.0"?>
<c>
ab
</c><c>
cd
</c>

抱歉,遗漏了示例代码

<root> ab <CH>xxxx</CH> cd <CH>xxxx</CH> </root>

current result: <c>ab</c><c>ab</c> 
desire result: <c>ab</c><c>cd</c>

3 个答案:

答案 0 :(得分:1)

看起来您正在寻找preceding-sibling轴。

此样式表:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="root" >
        <xsl:apply-templates select="CH"/>
    </xsl:template>
    <xsl:template match="CH" >
        <c>
            <xsl:value-of select="preceding-sibling::text()[1]"/>
        </c>
    </xsl:template>
</xsl:stylesheet>

输出:

<c> ab
</c><c> cd 
</c>

答案 1 :(得分:0)

../text()

返回两个文本节点,这两个节点是父节点的子节点。

  1. AB
  2. CD
  3. <xsl:value-of select="../text()" />

    隐式添加了[1]来将select语句过滤到select语句中的第一项。有很多种方法可以选择合适的文本节点,使用preceding-sibling::,如Alejandro建议的那样可能是最适合您的问题的方法,但另一种解决方案可以让您更清楚地了解当前../text()表达式的情况将模板更改为:

    <xsl:template match="CH" >
        <xsl:variable name="position" select="position()"/>
        <c> 
            <xsl:value-of select="../text()[$position]"/>
        </c>
    </xsl:template>
    

答案 2 :(得分:0)

<?xml version="1.0"?><xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="root">
      <xsl:apply-templates select ="CH"/>
  </xsl:template>
  <xsl:template match="CH" >
      <c><xsl:value-of select="preceding-sibling::text()[1]"/>
      </c>
</xsl:template>

尼克·琼斯提到,我们也可以使用“前兄弟”来解决问题,我只是在这里发帖,以防任何人感兴趣。