我是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>`
答案 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>