2013-02-22 213 views
1

我希望刪除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> 

回答

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