首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT添加子节点并将子节点移出外部。

XSLT添加子节点并将子节点移出外部。
EN

Stack Overflow用户
提问于 2016-01-10 10:55:00
回答 1查看 481关注 0票数 0

下面有一个输入XML:

代码语言:javascript
复制
<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属性的值。这只会影响CutiesLovable组。

代码语言:javascript
复制
<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,这将是一个很好的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-10 11:10:46

从标识模板开始,然后添加一个与输出中应该省略的狗群匹配的模板:

代码语言:javascript
复制
<xsl:template match="Group[@Name = 'Cuties' or @Name = 'Lovable']">

另一个对这些组中的Dog元素给予特殊待遇的是:

代码语言:javascript
复制
<xsl:template match="Group[@Name = 'Cuties' or @Name = 'Lovable']/Dog">

也就是说,添加一个Detail2元素作为它们的最后一个子元素。

XSLT样式表

代码语言:javascript
复制
<?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建议您可以将第一个模板缩短为

代码语言:javascript
复制
<xsl:template match="Group[@Name = ('Cuties','Lovable')]">

如果@Name的值与序列中的一个字符串相同,则谓词将为true。

XML输出

代码语言:javascript
复制
<?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模板是样式表中的唯一模板,那么所有的输入都不会被复制。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34704581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档