将两个属性的值连接到包含

时间:2017-02-08 21:32:48

标签: xslt

我有这样的XML:

   <Parent>
       <Elem1 Attr1="1" Attr2="2">
           <Elem2>
               <Elem3 Attr1="4" Attr2="5"></Elem3>
           </Elem2>
       </Elem1>
   </Parent>

应该变成这个:

  <Parent>
     <Elem1 Attr1="1+2">
        <Elem2>
           <Elem3 Attr1="4+5"></Elem3>
        </Elem2>
     </Elem1>
  </Parent>

问题在于我不知道元素的名称,即Elem1Elem3。我知道元素必须包含属性Attr1和属性Attr2,但不能提前包含所有这些元素名称。

我也知道父元素必须具有名称Parent,但包含属性的子元素可以处于任何级别,可以是直接后代,也可以是父树中更深层次的。

我能找到的最接近可能的解决方案就是这个 StackOverflow post但我的XSLT知识还不足以让它适应这种情况。

2 个答案:

答案 0 :(得分:1)

我想你想做点什么:

XSLT 1.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:strip-space elements="*"/>

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

<xsl:template match="@Attr1[../@Attr2]">
    <xsl:attribute name="Attr1">
        <xsl:value-of select="."/>
        <xsl:text>+</xsl:text>
        <xsl:value-of select="../@Attr2"/>
    </xsl:attribute>
</xsl:template>

<xsl:template match="@Attr2[../@Attr1]"/>

</xsl:stylesheet>

答案 1 :(得分:1)

解决这个问题的一种方法是

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform 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="Parent//*[@Attr1 and @Attr2]/@Attr1">
        <xsl:attribute name="Attr1" select="concat(., '+', ../@Attr2)"/>
    </xsl:template>

    <xsl:template match="Parent//*[@Attr1 and @Attr2]/@Attr2"/>

</xsl:transform>

http://xsltransform.net/ejivdHM