如何修改创建的输出DOM元素?

时间:2017-02-27 08:11:22

标签: xml xslt xslt-1.0 xslt-2.0 xmlconvert

我有xml

<Root>
   <A>
     <B>X</B>
     <C>Y</C>
     <D>Z</D>
   </A>
</Root>

使用xslt转换,我需要得到这个:

<Root>
  <Wrap type="B">
   <A>
     <B>X</B>
   </A>
  </Wrap>
  <Wrap type="C">
   <A>
     <B>Y</B>
   </A>
  </Wrap>
  <Wrap type="D">
   <A>
     <B>Z</B>
   </A>
  </Wrap>
</Root>

我应该使用哪种xsl::select?以及如何在xsl

中修改刚创建的元素

编辑:更正错字,问题更新。 我在列表中添加另一个元素,现在它是A的列表,应该被分类。

<Root>
   <A>
     <B>X</B>
     <C>Y</C>
     <D>Z</D>
   </A>
   <A>
     <B>X1</B>
     <C>Y1</C>
     <D>Z1</D>
   </A>
</Root>

现在我想得到

<Root>
  <Wrap type="B">
   <A>
     <B>X</B>
     <B>X1</B>
   </A>
  </Wrap>
  <Wrap type="C">
   <A>
     <B>Y</B>
     <B>Y1</B>
   </A>
  </Wrap>
  <Wrap type="D">
   <A>
     <B>Z</B>
     <B>Z1</B>
   </A>
  </Wrap>
</Root>

2 个答案:

答案 0 :(得分:0)

使用此

<xsl:template match="Root">
    <xsl:copy>
    <xsl:for-each select="A[1]/*">
        <xsl:variable name="en" select="local-name(current())"/>
        <Wrap type="{local-name(current())}">
            <A>
                <xsl:for-each select="//A/*[name() eq $en]">
                <B>
                    <xsl:value-of select="."/>
                </B>
                </xsl:for-each>
            </A>
        </Wrap>
    </xsl:for-each>
    </xsl:copy>
</xsl:template>

答案 1 :(得分:0)

更新了分组:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    >
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>


<xsl:template match="Root">
  <xsl:copy>
    <xsl:for-each-group select="A/*" group-by="name()">
      <xsl:element name="Wrap">
        <xsl:attribute name="name"><xsl:value-of select="current-grouping-key()" /></xsl:attribute>
        <A>
          <xsl:for-each select="current-group()">
            <B>
              <xsl:value-of select="." />
            </B>
          </xsl:for-each>
        </A>
      </xsl:element>
    </xsl:for-each-group>
  </xsl:copy>
</xsl:template>  


</xsl:stylesheet>