我快到了,但在最后一部分被困住了。我正试图改变这一点:
<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>至
<record>
<title>
<en>title EN</en>
<nl>title NL</nl>
</title>
<technique>
<en>tech EN</en>
<nl>tech NL</nl>
</technique>
</record>我有一个样式表:
<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>但这就产生了这样的结果:
<record>
<en>title EN</en>
<nl>title NL</nl>
<en>tech EN</en>
<nl>tech NL</nl>
</record>所以就快到了,但是我不知道如何获得嵌套在<title>和<technique>元素中的新元素
我希望有人能帮我,谢谢提前!
沃特
编辑:
这里是完整的XML (嗯,只有两个元素,但这应该会让我更好地了解我想要实现的目标。只有有两次(带有语言属性)的元素才应该是transformed...the,文档的其余部分应该保持原样。
<?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> 发布于 2021-01-07 21:33:24
也可以采用一种完全通用的方式:
<?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>发布于 2021-01-07 20:44:21
使用身份转换模板并不是强制性的。
两个简单的循环(拉式)完成这项工作。
XSLT
<?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>发布于 2021-01-07 21:01:17
如果(看起来)预先知道带有language属性的元素的名称,您可以简单地这样做:
XSLT1.0
<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。
https://stackoverflow.com/questions/65619444
复制相似问题