Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops XSLT通过节点循环以获得所需的层次结构_Loops_Xslt - Fatal编程技术网

Loops XSLT通过节点循环以获得所需的层次结构

Loops XSLT通过节点循环以获得所需的层次结构,loops,xslt,Loops,Xslt,我有一个xml。我想根据BA的值获取的值。我的XSLT正在检索的所有值,如图所示。我希望根据BA获取的值,正如我在所需的XML输出中所示 XML数据:- <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <Parent> <parent1 id="parent1_313_1"> <child

我有一个xml。我想根据
BA
的值获取
的值。我的XSLT正在检索
的所有值,如图所示。我希望根据
BA
获取
的值,正如我在所需的XML输出中所示

XML数据:-

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Parent>
    <parent1 id="parent1_313_1">
        <child1>Child_value1</child1>
        <records>
            <record id="parent1_313_1_r1">
                <data>
                    <entry>
                        <key>AA</key>
                        <value>AA1</value>
                    </entry>
                    <entry>
                        <key>BA</key>
                        <value>BA1</value>
                    </entry>
                </data>
            </record>
            <record id="parent1_313_1_r2">
                <data>
                    <entry>
                        <key>AA</key>
                        <value>AA1</value>
                    </entry>
                    <entry>
                        <key>BA</key>
                        <value>BA1</value>
                    </entry>
                </data>
            </record>
     </records>  
</parent1>
 <parent1 id="parent2_313_1">
        <child1>Child_blank</child1>
        <records>
            <record id="parent2_313_1_r1">
                <data>
                    <entry>
                        <key>AA</key>
                        <value>AA1</value>
                    </entry>
                    <entry>
                        <key>BA</key>
                        <value></value>
                    </entry>
                </data>
            </record>
            <record id="parent2_313_1_r2">
                <data>
                    <entry>
                        <key>AA</key>
                        <value>AA1</value>
                    </entry>
                    <entry>
                        <key>BA</key>
                        <value></value>
                    </entry>
                </data>
            </record>
     </records>  
</parent1>
<parent1 id="parent3_313_1">
        <child1>Child_value3</child1>
        <records>
            <record id="parent3_313_1_r1">
                <data>
                    <entry>
                        <key>AA</key>
                        <value>AA1</value>
                    </entry>
                    <entry>
                        <key>BA</key>
                        <value>BA3</value>
                    </entry>
                </data>
            </record>
            <record id="parent3_313_1_r2">
                <data>
                    <entry>
                        <key>AA</key>
                        <value>AA1</value>
                    </entry>
                    <entry>
                        <key>BA</key>
                        <value>BA3</value>
                    </entry>
                </data>
            </record>
     </records>  
</parent1>
<parent1 id="parent4_313_1">
        <child1>Child_value4</child1>
        <records>
            <record id="parent4_313_1_r1">
                <data>
                    <entry>
                        <key>AA</key>
                        <value>AA1</value>
                    </entry>
                    <entry>
                        <key>BA</key>
                        <value>BA3</value>
                    </entry>
                </data>
            </record>
            <record id="parent4_313_1_r2">
                <data>
                    <entry>
                        <key>AA</key>
                        <value>AA1</value>
                    </entry>
                    <entry>
                        <key>BA</key>
                        <value>BA3</value>
                    </entry>
                </data>
            </record>
     </records>  
</parent1>
</Parent>

儿童价值1
AA
AA1
文学士
BA1
AA
AA1
文学士
BA1
童装
AA
AA1
文学士
AA
AA1
文学士
儿童价值3
AA
AA1
文学士
BA3
AA
AA1
文学士
BA3
儿童价值4
AA
AA1
文学士
BA3
AA
AA1
文学士
BA3
我的XSLt代码

<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
               xmlns:xyz="http://www.tridan.it/xyz"  
               version="2.0">

    <xsl:output indent="yes" />
    <xsl:strip-space elements="*" />
    <xsl:variable name="APOS" select='"&apos;"'/>

    <xsl:function name="xyz:formatId">
        <xsl:param name="unformattedId"/>
        <xsl:value-of select="translate($unformattedId, concat(' &amp;/()][*,’|\',$APOS), '_')"/>
    </xsl:function>

    <xsl:template match="/">
            <xsl:variable name="ccName2" select="Parent/parent1/child1"/>
            <cccs>
                    <xsl:for-each-group select="Parent/parent1/records/record/data/entry[key='BA']" group-by="value">
                        <xsl:variable name="ccName1" select="current-group()[1]/value"/>
                        <ccc>
                            <xsl:choose>
                                <xsl:when test="$ccName1=''">
                                    <xsl:attribute name="id"><xsl:value-of select="xyz:formatId('BA_unknown')"/></xsl:attribute>
                                    <name><xsl:value-of select="'Default'"/></name>
                                </xsl:when>
                            <xsl:otherwise>
                                    <xsl:attribute name="id"><xsl:value-of select="xyz:formatId(concat('BA','_',$ccName1))"/></xsl:attribute>
                                    <name><xsl:value-of select="$ccName1"/></name>
                                    
                        </xsl:otherwise>
                            </xsl:choose>
                            <cccs>
                            
                                <xsl:for-each-group select="distinct-values($ccName2)" group-by="$ccName2">
                                <ccc>
                                       
                                        <xsl:attribute name="id">
                                                <xsl:choose>
                                                
                                                    <xsl:when test="$ccName1=''">
                                                         
                                                        <xsl:value-of select="xyz:formatId(concat('BA_Unknown','_',current-grouping-key()))"/>
                                                    </xsl:when>
                                                <xsl:when test="$ccName1!=''">
                                                         <xsl:value-of select="xyz:formatId(concat('BA','_',$ccName1,'_',current-grouping-key()))"/>
                                                </xsl:when>
                                                </xsl:choose>       
                                        </xsl:attribute>
                                        <name>
                                            <xsl:value-of select="current-grouping-key()"/>
                                        </name>
                                        
                                </ccc>
                            
                                </xsl:for-each-group>   
                            </cccs>
                        </ccc>
                    </xsl:for-each-group>
                </cccs>

    </xsl:template>
</xsl:transform>

输出XML实际值:-

<?xml version="1.0" encoding="UTF-8"?>
<cccs xmlns:xyz="http://www.tridan.it/xyz">
    <ccc id="BA_BA1">
        <name>BA1</name>
        <cccs>
            <ccc id="BA_BA1_Child_value1">
                <name>Child_value1</name>
            </ccc>
            <ccc id="BA_BA1_Child_blank">
                <name>Child_blank</name>
            </ccc>
            <ccc id="BA_BA1_Child_value3">
                <name>Child_value3</name>
            </ccc>
            <ccc id="BA_BA1_Child_value4">
                <name>Child_value4</name>
            </ccc>
        </cccs>
    </ccc>
    <ccc id="BA_unknown">
        <name>Default</name>
        <cccs>
            <ccc id="BA_Unknown_Child_value1">
                <name>Child_value1</name>
            </ccc>
            <ccc id="BA_Unknown_Child_blank">
                <name>Child_blank</name>
            </ccc>
            <ccc id="BA_Unknown_Child_value3">
                <name>Child_value3</name>
            </ccc>
            <ccc id="BA_Unknown_Child_value4">
                <name>Child_value4</name>
            </ccc>
        </cccs>
    </ccc>
    <ccc id="BA_BA3">
        <name>BA3</name>
        <cccs>
            <ccc id="BA_BA3_Child_value1">
                <name>Child_value1</name>
            </ccc>
            <ccc id="BA_BA3_Child_blank">
                <name>Child_blank</name>
            </ccc>
            <ccc id="BA_BA3_Child_value3">
                <name>Child_value3</name>
            </ccc>
            <ccc id="BA_BA3_Child_value4">
                <name>Child_value4</name>
            </ccc>
        </cccs>
    </ccc>
</cccs>

BA1
儿童价值1
童装
儿童价值3
儿童价值4
违约
儿童价值1
童装
儿童价值3
儿童价值4
BA3
儿童价值1
童装
儿童价值3
儿童价值4
所需的输出XML:-

<?xml version="1.0" encoding="UTF-8"?>
<cccs xmlns:xyz="http://www.tridan.it/xyz">
    <ccc id="BA_BA1">
        <name>BA1</name>
        <cccs>
            <ccc id="BA_BA1_Child_value1">
                <name>Child_value1</name>
            </ccc>
        </cccs>
    </ccc>
    <ccc id="BA_unknown">
        <name>Default</name>
        <cccs>
            <ccc id="BA_Unknown_Child_blank">
                <name>Child_blank</name>
            </ccc>
        </cccs>
    </ccc>
    <ccc id="BA_BA3">
        <name>BA3</name>
        <cccs>
            <ccc id="BA_BA3_Child_value3">
                <name>Child_value3</name>
            </ccc>
            <ccc id="BA_BA3_Child_value4">
                <name>Child_value4</name>
            </ccc>
        </cccs>
    </ccc>
</cccs>

BA1
儿童价值1
违约
童装
BA3
儿童价值3
儿童价值4

我认为我的内部循环没有获取正确的数据。我是XSLT新手。请分享我遗漏的信息。

我认为您只需要分组一次:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    expand-text="yes"
    version="3.0">

  <xsl:output method="xml" indent="yes" />

  <xsl:template match="Parent">
      <cccs>
          <xsl:for-each-group select="parent1/child1" group-by="..//entry[key = 'BA']/value">
              <ccc id="BA_{if (current-grouping-key()) then current-grouping-key() else 'unknown'}">
                <name>{if (current-grouping-key()) then current-grouping-key() else 'default'}</name>
                <cccs>
                  <xsl:apply-templates select="current-group()"/>
                </cccs>
              </ccc>
          </xsl:for-each-group>
      </cccs>
  </xsl:template>
  
  <xsl:template match="child1">
    <ccc id="BA_{if (current-grouping-key()) then current-grouping-key() else 'unknown'}_{.}">
      <name>{.}</name>
    </ccc>
  </xsl:template>
  
</xsl:stylesheet>

{if(current-grouping-key())则current-grouping-key()否则为“默认值”}
{.}

请用文字解释所需的逻辑。谢谢Martin,这真的很有帮助。我和一个不同的人一起搬家