XSL删除特定节点并添加新添加新节点

时间:2013-02-22 10:32:02

标签: xml xslt

我希望删除xml中的几个节点并添加一个新节点。让我用以下xml来说明:

<resprocessing>
  <respcondition title="Correct" continue="No">
    <conditionvar>
      <varequal respident="Response_0">
        <nhm_blank_name>Answer:</nhm_blank_name>
        <nhm_numerator>14</nhm_numerator>
        <nhm_denominator>25</nhm_denominator>
        <nhm_allow_multiples>No</nhm_allow_multiples>
      </varequal>
    </conditionvar>
  </respcondition>
</resprocessing>

我想删除节点<nhm_numerator><nhm_denominator>并在<nhm_blank_value>下插入新节点(<varequal>),同时保留其他两个节点<nhm_blank_name> { {1}}

新节点的值如下:

<nhm_allow_multiples>

我使用以下XSLT成功删除上述节点。但我无法添加新节点。请告诉我哪里出错了

<nhm_blank_value>
<math xmlns="http://www.w3.org/1998/Math/MathML">
  <mfrac>
    <mn>14</mn>
    <mn>25</mn>
  </mfrac>
</math>
</nhm_blank_value>

1 个答案:

答案 0 :(得分:1)

我会做这样的事情

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*" />

  <!-- copy the xml as it is -->   
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <!-- delete denominator -->
  <xsl:template  match="nhm_denominator" />

  <!-- replace numerator with mathml fragment -->
  <xsl:template match="nhm_numerator">
    <nhm_blank_value>
      <math xmlns="http://www.w3.org/1998/Math/MathML">
        <mfrac>
          <mn><xsl:value-of select="." /></mn>
          <mn><xsl:value-of select="../nhm_denominator"/></mn>
        </mfrac>
      </math>
    </nhm_blank_value>
  </xsl:template>   

</xsl:stylesheet>

这将从原始XML中提取正确的分子和分母值,而不是硬编码14和25.当在示例XML上运行时,它会生成正确的输出:

<resprocessing>
  <respcondition title="Correct" continue="No">
    <conditionvar>
      <varequal respident="Response_0">
        <nhm_blank_name>Answer:</nhm_blank_name>
        <nhm_blank_value>
          <math xmlns="http://www.w3.org/1998/Math/MathML">
            <mfrac>
              <mn>14</mn>
              <mn>25</mn>
            </mfrac>
          </math>
        </nhm_blank_value>
        <nhm_allow_multiples>No</nhm_allow_multiples>
      </varequal>
    </conditionvar>
  </respcondition>
</resprocessing>