我在下面有一个输入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,这对于解决这个问题非常有帮助
答案 0 :(得分:2)
从身份模板开始,然后添加一个模板,该模板与输出中应省略的狗群相匹配:
<xsl:template match="Group[@Name = 'Cuties' or @Name = 'Lovable']">
和另一个对这些组中的Dog
元素进行特殊处理:
<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>
如果您使用的是XSLT 2.0,Martin Honnen建议您可以将第一个模板缩短为
<xsl:template match="Group[@Name = ('Cuties','Lovable')]">
如果@Name
的值与序列中的一个字符串相同,则谓词为真。
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>
在线试用此解决方案here。
修改强>
是身份模板的目的,按原样复制全部?
是的,确切地说。如果identy模板是样式表中唯一的模板,则所有输入都将保持不变。