基于某些条件使用XSL将XML转换为另一个XML

时间:2015-06-16 10:02:35

标签: xml xslt

我有一个XML -

<root>
 <gereratorList>
    <generator>
        <id>1</id>
        <A>123</A>
    </generator>
    <generator>
        <id>10</id>
        <A>456</A>
    </generator>
    <generator>
        <id>111</id>
        <A>789</A>
    </generator>
</gereratorList>
</root>

我想通过XSL将这个XML转换为另一个XML。生成的XML应该是这样的 -

<parent>
    <child>
            <test>456</test>
    <child>
</parent>

但是我在转换后得到以下XML -

<parent>
    <child>
            <test>123 456 789</test>
    <child>
</parent>

我的XSL如下 -

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

<xsl:template match="/">
<xsl:element name="parent">
  <xsl:apply-templates select="root/generatorList/generator"/>
</xsl:element>
</xsl:template>

<xsl:template match="root/generatorList/generator">
<xsl:element name="child">
     <xsl:if test="/root/generatorList/generator/id='10'">
        <xsl:element name="test">
            <xsl:value-of select="A"/>
        </element>
     </xsl:if>
</element>
</template>
</stylesheet>

请帮忙。

3 个答案:

答案 0 :(得分:0)

请改用以下内容:

注意: gererator(在XML中)与XSLT的拼写差异。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <parent>
        <child>
            <test>
                <xsl:value-of select="root/gereratorList/generator[id = '10']/A"/>
            </test>
        </child>
    </parent>
</xsl:template>
</xsl:stylesheet>

答案 1 :(得分:0)

@Gaurav,

请使用以下XSL

<?xml version="1.0" ?>
 <xsl:stylesheet version="2.0"`xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="generator">

<xsl:choose>
<xsl:when test = "id = 10">
<parent>
<child>
<test>
<xsl:value-of select ="A"/>
</test>
</child>
</parent>
</xsl:when>
</xsl:choose>
</xsl:template>
 </xsl:stylesheet>

答案 2 :(得分:0)

您的xsl无效 这个是正确的,并给你预期的结果

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

<xsl:template match="/">
<xsl:element name="parent">
  <xsl:apply-templates select="/root/gereratorList/generator"/>
</xsl:element>
</xsl:template>

<xsl:template match="generator">    
  <xsl:if test="id='10'">
    <xsl:element name="child">
     <xsl:element name="test">
       <xsl:value-of select="A"/>
     </xsl:element>
    </xsl:element>
  </xsl:if>
</xsl:template>
</xsl:stylesheet>

正如您所看到的,几乎没有差异。

你的错误是:

  • 结束标记不正确(</element>代替</xsd:element>

  • 如果test不在当前生成器节点上,但在所有节点上