XSLT基于属性值ID重新组合

时间:2016-03-23 20:34:48

标签: xml xslt-2.0 xslt-grouping

我有以下XML

<group id="a">
<Name>Number One</Name>
<setgroup>
<refgroup ID="b">
<refgroup ID="c">
</setgroup>
</group>


<group id="b">
<Name>Number Two</Name>
<setgroup>
<refgroup ID="c">
<refgroup ID="e">
</setgroup>
</group>

<group id="c">
<Name>Number Three</Name>
<setgroup>
<refgroup ID="g">
<refgroup ID="f">
</setgroup>
</group>

作为输出我需要

<Product>
   <Name>Number One</Name>
   <Product>
    <Name>Number Two</Name>
       <Product>
          <Name>Number Three</Name>
       </Product>
   </Product>
</Product>

基本上,只要我遍历该节点,我的新xml就不会再次包含在内。

所以我需要根据我的xslt

进行撤销

到目前为止:

<Products>
                <xsl:for-each select="*:PIMXMLExport[fn:namespace-uri() eq '']/*:group[fn:namespace-uri() eq '']">
                    <Product>
                        <Name>
                            <xsl:for-each select="(./*:Name[fn:namespace-uri() eq '']/node())[fn:boolean(self::text())]">
                                <xsl:sequence select="fn:string(.)"/>
                            </xsl:for-each>
                        </Name>
                        <xsl:for-each select="*:setgroup[fn:namespace-uri() eq '']/*:refgroup[fn:namespace-uri() eq '']">
                            <Product>
                                    <Name>
                                     <xsl:variable name="header_pos" select="@OIDRef"/>
                                        <xsl:value-of select="/PIMXMLExport/group[@asimoid = $header_pos]/Name"/>
                                    </Name>
                            </Product>
                        </xsl:for-each> 
                    </Product>
                </xsl:for-each>
            </Products>

1 个答案:

答案 0 :(得分:0)

如果您按照设计使用XSLT的方式使用XSLT,这是一个非常容易的问题之一:使用xsl:apply-templates和模板规则而不是嵌套的xsl:for-each和conditionals。

解决方案的关键方面是:

(a)处理 MyCustomPinHolder.info1 = ""; MyCustomPinHolder.info2 = ""; 元素的模板规则:

<group>

(b)按ID

查找群组的密钥
<xsl:template match="group">
<Product>
  <xsl:copy-of select="Name"/>
  <xsl:apply-templates/>
</Product>
</xsl:template>

(c)与refgroup元素匹配的模板规则:

<xsl:key name="gpKey" match="group" use="id"/>