下面有一个输入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,这将是一个很好的帮助
发布于 2016-01-10 11:10:46
从标识模板开始,然后添加一个与输出中应该省略的狗群匹配的模板:
<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>如果使用XSLT2.0,Martin Honnen建议您可以将第一个模板缩短为
<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>尝试此解决方案在线这里。
编辑
身份模板的目的是复制所有的原样吗?
是的,完全正确。如果identy模板是样式表中的唯一模板,那么所有的输入都不会被复制。
https://stackoverflow.com/questions/34704581
复制相似问题