XSLT添加重复节点的新实例

时间:2016-03-02 15:27:06

标签: xml xslt

我是XSLT的新手,正在寻找一种方法来将重复节点/元素添加到现有列表中。这是一个示例xml。如何使用XSLT添加狗或猫的新实例?

`<?xml version="1.0" encoding="UTF-16"?>
<Animals>
    <Cats>
        <Cat>
            <Name>Felix</Name>
            <Color>Orange</Color>
            <Gender>Male</Gender>
            <Age>5</Age>
        </Cat>
        <Cat>
            <Name>Fluffy</Name>
            <Color>White</Color>
            <Gender>Female</Gender>
            <Age>4</Age>
        </Cat>      
        <Cat>
            <Name>Shadow</Name>
            <Color>Black</Color>
            <Gender>Female</Gender>
            <Age>2</Age>
        </Cat>          
    </Cats>
    <Dogs>
        <Dog>
            <Name>Spot</Name>
            <Color>White/Brown/Black</Color>
            <Gender>Male</Gender>
            <Age>11</Age>
        </Dog>
        <Dog>
            <Name>Rocky</Name>
            <Color>Black</Color>
            <Gender>Male</Gender>
            <Age>8</Age>
        </Dog>      
        <Dog>
            <Name>Goldie</Name>
            <Color>Gold</Color>
            <Gender>Female</Gender>
            <Age>3</Age>
        </Dog>          
    </Dogs> 
</Animals>`

2 个答案:

答案 0 :(得分:0)

如果你每次都要手动更新xslt ......你可以使用这样的东西,你需要不断添加Dog / Cat节点

<?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" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

 <xsl:template match="/Animals/Cats/Cat">
<Cat>
        <Name>New</Name>
        <Color>New</Color>
        <Gender>New</Gender>
        <Age>500</Age>
    </Cat>
    <xsl:copy>
  <xsl:apply-templates select="@*|node()"/>
</xsl:copy>
  </xsl:template>
   <xsl:template match="/Animals/Dogs/Dog">
<Dog>
        <Name>New</Name>
        <Color>New</Color>
        <Gender>New</Gender>
        <Age>500</Age>
    </Dog>
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

  

我将手动更新XSLT并使用它来更新XML   新数据。

我认为这不是一个好方法,但如果你愿意,可以很容易地做到:

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="Cats">
    <xsl:copy>
        <xsl:apply-templates/>
        <Cat>
            <Name>New Cat</Name>
            <Color>New Cat's Color</Color>
            <Gender>New Cat's Gender</Gender>
            <Age>New Cat's Age</Age>
        </Cat>
    </xsl:copy>
</xsl:template>

<xsl:template match="Dogs">
    <xsl:copy>
        <xsl:apply-templates/>
        <Dog>
            <Name>New Dog</Name>
            <Color>New Dog's Color</Color>
            <Gender>New Dog's Gender</Gender>
            <Age>New Dog's Age</Age>
        </Dog>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

更智能的方法是将外部XML文档与其他数据结合使用,例如:

<强> Additions.xml

<Animals>
    <Cats>
        <Cat>
            <Name>New Cat</Name>
            <Color>New Cat's Color</Color>
            <Gender>New Cat's Gender</Gender>
            <Age>New Cat's Age</Age>
        </Cat>    
    </Cats>
    <Dogs>
        <Dog>
            <Name>New Dog</Name>
            <Color>New Dog's Color</Color>
            <Gender>New Dog's Gender</Gender>
            <Age>New Dog's Age</Age>
        </Dog>
    </Dogs> 
</Animals>

并让样式表将其与处理过的XML输入中的数据相结合:

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="*"/>

<!-- path to the additions document -->
<xsl:param name="additions" select="'additions.xml'"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Cats">
    <xsl:copy>
        <xsl:apply-templates/>
        <xsl:apply-templates select="document($additions)/Animals/Cats/Cat"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="Dogs">
    <xsl:copy>
        <xsl:apply-templates/>
        <xsl:apply-templates select="document($additions)/Animals/Dogs/Dog"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>