下面有一个输入XML:
<Dogs>
<Group Name="Cuties">
<Dog Breed="Beagle">
<Detail1>...</Detail1>
</Dog>
<Dog Breed="French Bulldog">
<Detail1>...</Detail1>
</Dog>
</Group>
<Group Name="Lovable">
<Dog Breed="Labrador">
<Detail1>...</Detail1>
</Dog>
<Dog Breed="Terrier">
<Detail1>...</Detail1>
</Dog>
</Group>
<Group Name="Bad">
<Dog Breed="S">
<Detail1>...</Detail1>
</Dog>
<Dog Breed="D">
<Detail1>...</Detail1>
</Dog>
</Group>
</Dogs>
我想要的输出是在<Dog>
中添加另一个子节点,并将它们移出<Group>
。新的子节点应该是其组的Name
属性的值。这应该只影响Cuties
和Lovable
组
<Dogs>
<Dog Breed="Beagle">
<Detail1>...</Detail1>
<Detail2>Cuties</Detail2>
</Dog>
<Dog Breed="French Bulldog">
<Detail1>...</Detail1>
<Detail2>Cuties</Detail2>
</Dog>
<Dog Breed="Labrador">
<Detail1>...</Detail1>
<Detail2>Lovable</Detail2>
</Dog>
<Dog Breed="Terrier">
<Detail1>...</Detail1>
<Detail2>Lovable</Detail2>
</Dog>
<Group Name="Bad">
<Dog Breed="S">
<Detail1>...</Detail1>
</Dog>
<Dog Breed="D">
<Detail1>...</Detail1>
</Dog>
</Group>
</Dogs>
我刚开始学习XSLT,弄清楚
从一个身份模板开始,然后添加一个与输出中应该省略的狗组匹配的模板:
<xsl:template match="Group[@Name = 'Cuties' or @Name = 'Lovable']">
另一种是对这些组中的CCD_ 6元素进行特殊处理:
<xsl:template match="Group[@Name = 'Cuties' or @Name = 'Lovable']/Dog">
即添加Detail2
元素作为它们的最后一个子元素。
XSLT样式表
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="no" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*"/>
<xsl:template match="Group[@Name = 'Cuties' or @Name = 'Lovable']">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="Group[@Name = 'Cuties' or @Name = 'Lovable']/Dog">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<Detail2>
<xsl:value-of select="../@Name"/>
</Detail2>
</xsl:copy>
</xsl:template>
<!--Identity template-->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:transform>
如果您使用的是XSLT2.0,MartinHonnen建议您可以将第一个模板缩短为
<xsl:template match="Group[@Name = ('Cuties','Lovable')]">
如果@Name
的值与序列中的一个字符串相同,则谓词为true。
XML输出
<?xml version="1.0" encoding="UTF-8"?>
<Dogs>
<Dog Breed="Beagle">
<Detail1>...</Detail1>
<Detail2>Cuties</Detail2>
</Dog>
<Dog Breed="French Bulldog">
<Detail1>...</Detail1>
<Detail2>Cuties</Detail2>
</Dog>
<Dog Breed="Labrador">
<Detail1>...</Detail1>
<Detail2>Lovable</Detail2>
</Dog>
<Dog Breed="Terrier">
<Detail1>...</Detail1>
<Detail2>Lovable</Detail2>
</Dog>
<Group Name="Bad">
<Dog Breed="S">
<Detail1>...</Detail1>
</Dog>
<Dog Breed="D">
<Detail1>...</Detail1>
</Dog>
</Group>
</Dogs>
请在此处联机尝试此解决方案。
编辑
身份模板的目的是什么,照原样复制?
没错。如果identity模板是样式表中唯一的模板,那么所有输入都将被复制而不改变。