剪切并粘贴到现有节点的末尾

时间:2013-12-09 14:45:26

标签: xml xslt

今天简单的问题:)。我试图从节点切割数据并将其粘贴到另一个节点的数据末尾。

所以看起来应该是这样的:

<x>
   <a>1234</a>
   <b>5678</b>
</x>

期望的输出

<x>
   <a>12345678</a>
</x>

我目前的测试xslt是:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
<xsl:param name="ename">Test</xsl:param>
<xsl:param name="evalue">Test1234</xsl:param>

<xsl:param name="removeElementsNamed" select="'Test'"/>

<xsl:output method="xml" encoding="utf-8"/>
<xsl:template match="@*|node()" name="input">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>
<xsl:template match="Record">
    <xsl:copy>
        <xsl:apply-templates/>
            <xsl:if test="not(c)">
                <xsl:element name="{$ename}"><xsl:value-of select="$evalue"/></xsl:element>
            </xsl:if>                
    </xsl:copy>        
</xsl:template>
<xsl:template match="Record">
    <xsl:if test="not(name() = $removeElementsNamed)">
        <xsl:call-template name="input"/>
    </xsl:if>
</xsl:template>

我知道某些内容应该在<xsl:copy>标签中,但我真的不知道是什么。尝试过一些没有用的东西。帮助赞赏谢谢

编辑:我刚刚意识到我的问题稍微复杂一些,我现在应该说明原因。

我的xml文件具有以下结构

 <root>
   <payload>01234</payload>
   <metadata>
      <metadata-element>
          <key>key</key>
          <value>value</value>
      </metadata-element>
   </metadata>
   <metadata>
       <metadata-element>
           <key>foo</key>
           <value>5678</value>
       </metadata-element>
   </metadata>
</root>

期望的输出

<root>
   <payload>012345678</payload>
   <metadata>
      <metadata-element>
          <key>key</key>
          <value>value</value>
      </metadata-element>
   </metadata>
</root>

2 个答案:

答案 0 :(得分:2)

怎么样:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="utf-8" indent="yes"/>

<xsl:template match="/">
<root>
    <xsl:for-each select="root/payload">
        <xsl:copy>
            <xsl:value-of select="concat(., following-sibling::metadata[2]/metadata-element/value)" />
        </xsl:copy>
        <xsl:copy-of select="following-sibling::metadata[1]"/>
    </xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet> 

编辑:

因为你说它们应该按值选择(我假设它是<key>元素的值):

<xsl:template match="/">
<root>
    <xsl:for-each select="root/payload">
        <xsl:copy>
            <xsl:value-of select="concat(., following-sibling::metadata[metadata-element/key='foo'][1]/metadata-element/value)" />
        </xsl:copy>
        <xsl:copy-of select="following-sibling::metadata[metadata-element/key='key'][1]"/>
    </xsl:for-each>
</root>
</xsl:template>

答案 1 :(得分:1)

使用您选择向我们展示的输入结构,此样式表将执行此操作。

编辑:更新了样式表

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

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

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="root">
  <xsl:copy>
     <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="payload">
  <xsl:copy>
     <xsl:value-of select="."/>
     <xsl:value-of select="following-sibling::metadata/metadata-element[key='foo']/value"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="metadata[metadata-element/key='key']">
<xsl:copy>
  <xsl:apply-templates/>
</xsl:copy>
</xsl:template>

<xsl:template match="metadata-element|key|value">
<xsl:copy>
  <xsl:apply-templates/>
</xsl:copy>
</xsl:template>

<xsl:template match="metadata[metadata-element/key='foo']"/>

</xsl:stylesheet>

产生以下输出: 编辑:更新了输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <payload>012345678</payload>
 <metadata>
  <metadata-element>
     <key>key</key>
     <value>value</value>
  </metadata-element>
 </metadata>
</root>
  

我知道应该有标签,但我不是   知道什么。

请注意,xsl:copy将上下文中的节点复制到输出树。如果模板与a元素匹配,则此指令将a复制到输出树。您在xsl:copy内编写的任何XLST代码都将放在复制元素内。

我很清楚你的输入XML实际上是非常不同的,但是你没有将它包含在内。因此,我的帖子只是回答你的要求。