如何在新父级下移动多个元素,但只能移动一次?

时间:2016-03-09 11:48:19

标签: xslt xslt-2.0

我想在新父级下嵌套某些元素,但仅限于某些id值。一旦它们嵌套,它们就不能再重复了。

来源:

<root name="root 1">
  <elem id="java" value="val1"/>
  <elem id="python" value="val2"/>
  <elem id="chair" value="val3"/>
</root>

通缉结果:

<root name="root 1">
  <container name="lang">
    <elem id="java" value="val1"/>
    <elem id="python" value="val2"/>
  </container>
  <elem id="chair" value="val3"/>
</root>

额外捕获:可能并非所有嵌套目标都可用。然而,它们应该用空值嵌套。

来源:

<root name="root 1">
  <elem id="java" value="val1"/>
  <elem id="chair" value="val3"/>
</root>

目标:

<root name="root 1">
  <container name="lang">
    <elem id="java" value="val1"/>
    <elem id="python" value=""/>
  </container>
  <elem id="chair" value="val3"/>
</root>

我的结果不断重复container。我该如何按预期进行转换?

1 个答案:

答案 0 :(得分:0)

您可以在XSLT 2.0中循环遍历字符串列表。所以这可能会起到作用:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>


  <xsl:template match="root">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:variable name="elems" select="elem"/>
      <container>
        <xsl:for-each select="('java', 'python')">
          <elem id="{.}" value="{string($elems[@id=current()]/@value)}"/>
        </xsl:for-each>
      </container>

      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="elem[@id=('java', 'python')]"/>
</xsl:stylesheet>