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

问题描述:

我希望删除xml中的少数节点并添加新节点。让我说明与下面的XML:XSL删除特定节点并添加新添加新节点

<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><varequal>下插入一个新节点(<nhm_blank_value>),同时保留其他两个节点<nhm_blank_name><nhm_allow_multiples>

新节点一个这样的值:

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

我用下面的XSLT成功删除了上述节点。但我无法添加新节点。请告诉我在哪里,我要去错

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:param name="mathml"> 
    <nhm_blank_value> 
    <math xmlns="http://www.w3.org/1998/Math/MathML"> 
     <mfrac> 
     <mn>14</mn> 
     <mn>25</mn> 
     </mfrac> 
    </math> 
    </nhm_blank_value> 
</xsl:param> 
<!-- copy the xml as it is --> 
    <xsl:template match="node()|@*"> 
     <xsl:copy> 
      <xsl:apply-templates select="node()|@*"/> 
     </xsl:copy> 
    </xsl:template> 
    <!-- deleting nodes numerator and denominator --> 
    <xsl:template match="questestinterop/item/resprocessing/respcondition/conditionvar/varequal/nhm_denominator" /> 
    <xsl:template match="questestinterop/item/resprocessing/respcondition/conditionvar/varequal/nhm_numerator" /> 
    <!-- adding mathml node --> 
    <xsl:template match="questestinterop/item/resprocessing/respcondition/conditionvar"> 
    <xsl:value-of select="varequal"> 
     <xsl:with-param name="mathml"/> 
    </xsl:value-of> 
    </xsl:template> 
</xsl:stylesheet> 

我会做这样的事情

<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> 
+0

那真棒。但是,我可以添加通过参数值,而更换分子节点?因为这个参数值将从java程序中填充。 – jaykumarark 2013-02-22 10:51:56

+0

@jaykumarark你是指一个包含整个替换片段的参数,或者只是分子/分母值? – 2013-02-22 10:54:21

+0

我的意思是包含片段的参数。该参数将从java程序接收mathml值。我想将参数值放在''node – jaykumarark 2013-02-22 10:56:51