XSL:无法检索(复制)元素内容?

时间:2014-01-13 12:53:41

标签: xml xslt

我不明白为什么我的元素内容没有被复制?

即。我的xml当前输出如下所示

<root>
  <foo>some content</foo>
  <set>
    <set-element>
      <set-key>some-key</set-key>
      <set-val/>
    </set-element>     
  </set>
</root>

所以这个想法是我想把元素中的东西复制到元素中。预期的输出应该是

<root>
  <foo>some content</foo>
  <set>
    <set-element>
      <set-key>some-key</set-key>
      <set-val>some content</set-val>
    </set-element> 
  </set>
</root>

我的xsl模板看起来像这样

<axsl:template match="set">
    <axsl:copy>
        <axsl:apply-templates select="@*|node()"/>
        <set-element>
            <set-key>some-key</set-key>
            <set-val><axsl:value-of select="foo"/></set-val>
        </set-element>
    </axsl:copy>
</axsl:template>

我尝试了很多东西:

<value><axsl:value-of select="root/foo"/></value>
<value><axsl:value-of select="root/foo/text()"/></value>
<value><axsl:value-of select="foo/text()"/></value>
<value><axsl:value-of select="foo/*"/></value>

我已经尝试将foo元素中的whats保存为参数,然后在value中使用该参数:但仍然没有成功 任何人都能看到我模板的问题吗?

修改

如果我的集合中有多个set-elements,即

,该怎么办?
<root>
  <foo>some content</foo>
  <set>
    <set-element>
      <set-key>some-key</set-key>
      <set-val>some content</set-val>
    </set-element> 
    <set-element>
      <set-key>some-key-2</set-key>
      <set-val>some content-2</set-val>
    </set-element> 
    <set-element>
      <set-key>some-key-3</set-key>
      <set-val/>
    </set-element> 
  </set>
</root>

我想将<foo>内容添加到第3个元素? 据我所知,这将要求<xsl:template match=value>有一些参数来指定要修改的值?

1 个答案:

答案 0 :(得分:2)

您的方法存在的问题是 context 。 XPath表达式可以是相对的,它们的分辨率取决于您在XML树中的确切位置。

换句话说,如果您的模板与set匹配,则以下行:

<axsl:value-of select="foo"/>

检索set子节点,其元素名称为“foo”。 (但是,当然,这个子节点不存在。)

要查找与上下文无关的节点,请在表达式中使用//。但我建议您不要使用它,只要您可以从上下文中引用节点,例如通过像preceding-sibling这样的轴。

样式表(已修改)

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
  <xsl:copy>
     <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="set-val[preceding-sibling::set-key='some-key-3']">
  <xsl:copy>
     <xsl:value-of select="parent::set-element/parent::set/preceding-sibling::foo[1]"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

输出(已修改)

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <foo>foo content</foo>
  <set>
    <set-element>
      <set-key>some-key</set-key>
      <set-val>some content</set-val>
    </set-element> 
    <set-element>
      <set-key>some-key-2</set-key>
      <set-val>some content-2</set-val>
    </set-element> 
    <set-element>
      <set-key>some-key-3</set-key>
      <set-val>foo content</set-val>
    </set-element> 
  </set>
</root>

请注意,我已更改您的输入。 foo的文字内容现在是“foo content”。