【问题标题】:How to modify created output DOM element?如何修改创建的输出 DOM 元素?
【发布时间】:2017-07-17 18:23:04
【问题描述】:

我有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>

【问题讨论】:

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


    【解决方案1】:

    使用这个

    <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>
    

    【讨论】:

    • Thx,如何将它用于 Root/A 列表? (见问题更新)
    • 太棒了!谢谢。
    【解决方案2】:

    更新分组:

    <?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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 2016-07-09
      • 2012-01-09
      • 2010-09-12
      • 1970-01-01
      • 2015-01-06
      • 1970-01-01
      相关资源
      最近更新 更多