首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将具有相同属性名的多个元素转换为以这些属性值作为子元素的新元素。

将具有相同属性名的多个元素转换为以这些属性值作为子元素的新元素。
EN

Stack Overflow用户
提问于 2021-01-07 20:26:36
回答 3查看 70关注 0票数 2

我快到了,但在最后一部分被困住了。我正试图改变这一点:

代码语言:javascript
复制
<record>
    <title language="en">title EN</title>
    <title language="nl">title NL</title>

    <technique language="en">tech EN</technique>
    <technique language="nl">tech NL</technique>
</record>

代码语言:javascript
复制
<record>
    <title>
      <en>title EN</en>
      <nl>title NL</nl>
    </title>
    <technique>
      <en>tech EN</en>
      <nl>tech NL</nl>
    </technique>
</record>

我有一个样式表:

代码语言:javascript
复制
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
 <!-- identity transform for otherwise-unmatched nodes and attributes -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

<!-- transform for title elements at any depth -->
  <xsl:template match="title">
            <xsl:element name="{@language}">
            <!-- transform this node's non-attribute children -->
           <xsl:apply-templates select="node()" />
           </xsl:element>
  </xsl:template>

 <xsl:template match="technique">
            <xsl:element name="{@language}">
            <!-- transform this node's non-attribute children -->
           <xsl:apply-templates select="node()" />
           </xsl:element>
  </xsl:template>

</xsl:stylesheet>

但这就产生了这样的结果:

代码语言:javascript
复制
<record>
      <en>title EN</en>
      <nl>title NL</nl>

      <en>tech EN</en>
      <nl>tech NL</nl>
</record>

所以就快到了,但是我不知道如何获得嵌套在<title><technique>元素中的新元素

我希望有人能帮我,谢谢提前!

沃特

编辑:

这里是完整的XML (嗯,只有两个元素,但这应该会让我更好地了解我想要实现的目标。只有有两次(带有语言属性)的元素才应该是transformed...the,文档的其余部分应该保持原样。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<resultset>
   <records>
      <record>
         <metadata>
            <dcls />
            <recordnumber>1</recordnumber>
            <publisher>XXX</publisher>
         </metadata>
         <data>
            <records>
               <objectid>12</objectid>
               <objectnumber>1212</objectnumber>
               <artist>
                  Bob
                  <alphasort>Bob</alphasort>
                  <displaydate>1937</displaydate>
               </artist>
               <title language="NL">Title in NL</title>
               <title language="EN">Title in EN</title>
               <category language="NL">Schilderkunst</category>
               <category Language="EN">Paintings</category>
               <dated>1972</dated>
               <datebegin>1972</datebegin>
               <dateend>1972</dateend>
               <technique language="NL">olieverf op doek</technique>
               <technique language="EN">oil on canvas</technique>
               <dimensions>150 x 150 cm</dimensions>
               <webtext language="EN">Some EN text</webtext>
               <webtext language="NL">Some NL text</webtext>
               <standplaats>Amsterdam</standplaats>
            </records>
         </data>
      </record>
      <record>
         <metadata>
            <dcls />
            <recordnumber>2</recordnumber>
            <publisher>XXX</publisher>
         </metadata>
         <data>
            <records>
               <objectid>33</objectid>
               <objectnumber>3333</objectnumber>
               <artist>
                  Saskia
                  <alphasort>Saskia</alphasort>
                  <displaydate>1982</displaydate>
               </artist>
               <title language="EN">title in EN</title>
               <title language="NL">title in NL</title>
               <Series>1 / 2</Series>
               <category language="NL">Fotografie</category>
               <category Language="EN">Photography</category>
               <dated>2016</dated>
               <datebegin>2016</datebegin>
               <dateend>2016</dateend>
               <technique language="NL">C-print op aluminium</technique>
               <technique language="EN">C-print on aluminum</technique>
               <dimensions>A2 (2x)</dimensions>
               <webtext language="NL">Some NL text</webtext>
               <webtext language="EN">Some EN text</webtext>
               <standplaats>Amsterdam</standplaats>
            </records>
         </data>
      </record>
   </records>
</resultset> 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-01-07 21:33:24

也可以采用一种完全通用的方式:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="2.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="*">
    <xsl:copy>
        <xsl:for-each-group select="*" group-by="name()">
          <xsl:element name="{current-grouping-key()}">
            <xsl:for-each select="current-group()/@*">
              <xsl:element name="{.}">
                <xsl:value-of select="../."/>
              </xsl:element>
            </xsl:for-each>
          </xsl:element>
        </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

看到它在这里工作:https://xsltfiddle.liberty-development.net/93nwMoz

票数 0
EN

Stack Overflow用户

发布于 2021-01-07 20:44:21

使用身份转换模板并不是强制性的。

两个简单的循环(拉式)完成这项工作。

XSLT

代码语言:javascript
复制
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" encoding="utf-8" indent="yes"/>

    <xsl:template match="/record">
        <record>
            <title>
                <xsl:for-each select="title">
                    <xsl:element name="{@language}">
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:for-each>
            </title>
            <technique>
                <xsl:for-each select="technique">
                    <xsl:element name="{@language}">
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:for-each>
            </technique>
        </record>
    </xsl:template>
</xsl:stylesheet>
票数 1
EN

Stack Overflow用户

发布于 2021-01-07 21:01:17

如果(看起来)预先知道带有language属性的元素的名称,您可以简单地这样做:

XSLT1.0

代码语言:javascript
复制
<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="/record">
    <xsl:copy>
        <title>
            <xsl:apply-templates select="title"/>
        </title>
        <technique>
            <xsl:apply-templates select="technique"/>
        </technique>
    </xsl:copy>
</xsl:template>

<xsl:template match="title | technique">
    <xsl:element name="{@language}">
        <xsl:value-of select="."/>
    </xsl:element>
</xsl:template>

</xsl:stylesheet>

否则,您需要将它们命名为group

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

https://stackoverflow.com/questions/65619444

复制
相关文章

相似问题

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