通过XSL将新节点添加到现有节点

时间:2015-09-22 09:05:26

标签: xml xslt

我需要在XML中保留少量值,并且需要通过XSLT添加新节点。

需要保留价值,并且需要添加新选项。

如何实现这一目标。以下是我的代码。

XML

<?xml version="1.0" encoding="utf-8"?>
<datas>
  <data key="key1">    
    <value>a</value>
    <options>
      <option>a</option>
      <option>b</option>
      <option>c</option>
    </options>
  </data>
  <data key="key2">    
    <value>z</value>
    <options>
      <option>x</option>
      <option>y</option>
      <option>z</option>
    </options>
  </data>
</datas>

XSLT

<?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"/>
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="datas">
    <datas>
      <data key="key1">        
        <value>
          <xsl:value-of select="/datas/data[key = 'key1']/value" />
        </value>
        <options>
          <option>a</option>
          <option>b</option>
          <option>c</option>
          <option>d</option>
        </options>
      </data>
      <data key="key2">       
        <value>
          <xsl:value-of select="/datas/data[key = 'key2']/value" />
        </value>
        <options>
          <option>x</option>
          <option>y</option>
          <option>z</option>
        </options>
      </data>
    </datas>    
  </xsl:template>
</xsl:stylesheet>

<option>d</option>没有被添加。

有人可以帮忙吗?

由于

1 个答案:

答案 0 :(得分:0)

  1. 而不是:

    <xsl:value-of select="/datas/data[key = 'key1']/value" />
    

    你需要:

    <xsl:value-of select="/datas/data[@key = 'key1']/value" />
    
    1.   

      <option>d</option>没有被添加。

      我无法使用您的代码重现此问题: http://xsltransform.net/94rmq5E

      1. 你可以让这更简单:

        XSLT 1.0

        <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:strip-space elements="*"/>
        
        <!-- identity transform -->
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
        
        <xsl:template match="data[@key='key1']/options">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
                <option>d</option>
            </xsl:copy>
        </xsl:template>
        
        </xsl:stylesheet>