Loops XSLT通过节点循环以获得所需的层次结构
我有一个xml。我想根据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
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='"'"'/>
<xsl:function name="xyz:formatId">
<xsl:param name="unformattedId"/>
<xsl:value-of select="translate($unformattedId, concat(' &/()][*,’|\',$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,这真的很有帮助。我和一个不同的人一起搬家