Xml 具有相同根节点名称的嵌套模板出现问题
您好,我有一个问题,根节点和子节点在output.xml文件中具有相同的名称,必须使用XSLT进行格式化才能对问题进行分组。 XML的数据如下所示Xml 具有相同根节点名称的嵌套模板出现问题,xml,xslt,Xml,Xslt,您好,我有一个问题,根节点和子节点在output.xml文件中具有相同的名称,必须使用XSLT进行格式化才能对问题进行分组。 XML的数据如下所示 <?xml version="1.0" encoding="UTF-8"?> <DATA_DS> <P_SVC_ID>NMW</P_SVC_ID> <P_BUS_UNIT>NMWSC</P_BUS_UNIT> <P_END_DATE>2016-01-16T08:00:
<?xml version="1.0" encoding="UTF-8"?>
<DATA_DS>
<P_SVC_ID>NMW</P_SVC_ID>
<P_BUS_UNIT>NMWSC</P_BUS_UNIT>
<P_END_DATE>2016-01-16T08:00:00.000+00:00</P_END_DATE>
<LOGO><!--Generated by Oracle BI Publisher 11.1.1.7.0-->
<Properties>
<IMG_DIR_PATH>images</IMG_DIR_PATH>
<IMGFILECAL>CWSCO.jpg</IMGFILECAL>
<IMGFILEHW>HWSCO.jpg</IMGFILEHW>
<IMGFILENM>NMWSC.jpg</IMGFILENM>
</Properties>
</LOGO>
<DATA_DS>
<G_2>
<RPTDEF>Report shows account balance of all customers under
30 60 90 or over 90 days old summarized
by AR balance per district
</RPTDEF>
</G_2>
<G_1>
<ENTITY_NAME>Aaron,M </ENTITY_NAME>
<ACCT_ID>08638132256</ACCT_ID>
<SA_ID>08638224515</SA_ID>
<CM_DISTRICT>CG</CM_DISTRICT>
<SA_BAL_CURRENT>0</SA_BAL_CURRENT>
<SA_BAL_31_60>0</SA_BAL_31_60>
<SA_BAL_61_90>0</SA_BAL_61_90>
<SA_BAL_OVER_90>0</SA_BAL_OVER_90>
<TOT_AMT>0</TOT_AMT>
</G_1>
<G_1>
<ENTITY_NAME>Madhu</ENTITY_NAME>
<ACCT_ID>8649446fr121</ACCT_ID>
<SA_ID>86494463rf41</SA_ID>
<CM_DISTRICT>CG</CM_DISTRICT>
<SA_BAL_CURRENT>0</SA_BAL_CURRENT>
<SA_BAL_31_60>0</SA_BAL_31_60>
<SA_BAL_61_90>0</SA_BAL_61_90>
<SA_BAL_OVER_90>0</SA_BAL_OVER_90>
<TOT_AMT>0</TOT_AMT>
</G_1>
<G_1>
<ENTITY_NAME>dCruz,Jared </ENTITY_NAME>
<ACCT_ID>748607238507</ACCT_ID>
<SA_ID>748607238446</SA_ID>
<CM_DISTRICT>WWA</CM_DISTRICT>
<SA_BAL_CURRENT>0</SA_BAL_CURRENT>
<SA_BAL_31_60>0</SA_BAL_31_60>
<SA_BAL_61_90>0</SA_BAL_61_90>
<SA_BAL_OVER_90>0</SA_BAL_OVER_90>
<TOT_AMT>0</TOT_AMT>
</G_1>
<G_1>
<ENTITY_NAME>d Sa6s,Geneva </ENTITY_NAME>
<ACCT_ID>803581432479</ACCT_ID>
<SA_ID>803581434216</SA_ID>
<CM_DISTRICT>WWA</CM_DISTRICT>
<SA_BAL_CURRENT>0</SA_BAL_CURRENT>
<SA_BAL_31_60>0</SA_BAL_31_60>
<SA_BAL_61_90>0</SA_BAL_61_90>
<SA_BAL_OVER_90>0</SA_BAL_OVER_90>
<TOT_AMT>0</TOT_AMT>
</G_1>
</DATA_DS>
</DATA_DS>
NMW
NMWSC
2016-01-16T08:00:00.000+00:00
图像
CWSCO.jpg
HWSCO.jpg
NMWSC.jpg
报告显示了所有客户的帐户余额
30 60 90天或90天以上总结
按地区应收账款余额计算
亚伦,M
08638132256
08638224515
CG
0
0
0
0
0
马杜
8649446fr121
86494463rf41
CG
0
0
0
0
0
杰瑞德·德克鲁兹
748607238507
748607238446
WWA
0
0
0
0
0
d Sa6s,日内瓦
803581432479
803581434216
WWA
0
0
0
0
0
========================================================================================
我正在尝试将所有元素,但G_1应根据CM_区域值进行分组,例如
CA。。。。。
因此,所有CA值CM_区都分组在该元素下
===============================================
我一直在使用以下XSL代码:
===================================================================================
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="DATA_DS" match="DATA_DS" use="DATA_DS"/>
<xsl:template match="DATA_DS">
<xsl:for-each select="DATA_DS">
<xsl:element name="DATA_DS">
<xsl:element name="P_SVC_ID"><xsl:value-of select="//P_SVC_ID" /></xsl:element>
<xsl:element name="P_BUS_UNIT"><xsl:value-of select="//P_BUS_UNIT"/></xsl:element>
<xsl:element name="P_END_DATE"><xsl:value-of select="//P_END_DATE"/></xsl:element>
<xsl:element name="LOGO">
<xsl:element name="Properties">
<xsl:element name="IMG_DIR_PATH"><xsl:value-of select="//IMG_DIR_PATH"/></xsl:element>
<xsl:element name="IMGFILECAL"><xsl:value-of select="//IMGFILECAL"/></xsl:element>
<xsl:element name="IMGFILEHW"><xsl:value-of select="//IMGFILEHW"/></xsl:element>
<xsl:element name="IMGFILENM"><xsl:value-of select="//IMGFILENM"/></xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:for-each>
</xsl:template>
<xsl:key name="groups" match="DATA_DS/DATA_DS/G_1/CM_DISTRICT" use="."/>
<xsl:template match="/DATA_DS/DATA_DS">
<DATA_DS>
<xsl:apply-templates select="/DATA_DS/DATA_DS/G_1/CM_DISTRICT[generate-id() = generate-id(key('groups', .)[1])]"/>
</DATA_DS>
</xsl:template>
<xsl:template match="DATA_DS/DATA_DS/G_1/CM_DISTRICT">
<xsl:variable name="currentGroup" select="."/>
<CM_DISTRICT>
<xsl:value-of select="$currentGroup"/>
<xsl:for-each select="key('groups', $currentGroup)">
<G_1>
<ACCT_ID>
<xsl:value-of select="../ACCT_ID"/>
</ACCT_ID>
<ENTITY_NAME>
<xsl:value-of select="../ENTITY_NAME"/>
</ENTITY_NAME>
</G_1>
</xsl:for-each>
</CM_DISTRICT>
</xsl:template>
</xsl:stylesheet>
===================================================================================
我已经分别实现了如下代码的分组,并获得了完美的结果
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:key name="groups" match="DATA_DS/DATA_DS/G_1/CM_DISTRICT" use="."/>
<xsl:template match="/DATA_DS/DATA_DS">
<DATA_DS>
<xsl:apply-templates select="/DATA_DS/DATA_DS/G_1/CM_DISTRICT[generate-id() = generate-id(key('groups', .)[1])]"/>
</DATA_DS>
</xsl:template>
<xsl:template match="DATA_DS/DATA_DS/G_1/CM_DISTRICT">
<xsl:variable name="currentGroup" select="."/>
<CM_DISTRICT>
<xsl:value-of select="$currentGroup"/>
<xsl:for-each select="key('groups', $currentGroup)">
<G_1>
<ACCT_ID>
<xsl:value-of select="../ACCT_ID"/>
</ACCT_ID>
<ENTITY_NAME>
<xsl:value-of select="../ENTITY_NAME"/>
</ENTITY_NAME>
</G_1>
</xsl:for-each>
</CM_DISTRICT>
</xsl:template>
</xsl:stylesheet>
这将为…带来正确的输出。。。。但其余的都被忽略了
但是,当我尝试将此代码与包含子节点的元素合并时,它只会带来第一个结果集。如何实现这一点?这里的关键是使用,因为这将负责复制您不需要修改但希望保留的所有其他节点
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
试试这个XSLT
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" method="xml"/>
<xsl:key match="G_1" name="groups" use="CM_DISTRICT"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/DATA_DS/DATA_DS">
<DATA_DS>
<xsl:apply-templates select="G_1[generate-id() = generate-id(key('groups', CM_DISTRICT)[1])]"/>
</DATA_DS>
</xsl:template>
<xsl:template match="G_1">
<xsl:variable name="currentGroup" select="CM_DISTRICT"/>
<CM_DISTRICT>
<xsl:value-of select="$currentGroup"/>
<xsl:for-each select="key('groups', $currentGroup)">
<G_1>
<ACCT_ID>
<xsl:value-of select="ACCT_ID"/>
</ACCT_ID>
<ENTITY_NAME>
<xsl:value-of select="ENTITY_NAME"/>
</ENTITY_NAME>
</G_1>
</xsl:for-each>
</CM_DISTRICT>
</xsl:template>
</xsl:stylesheet>
注:我简化了
的键,因为它可以更好地满足您按CM\u地区对G\u 1
元素进行分组的要求
还请注意,您不需要在模板匹配中指定G_1
元素的完整路径(仅当您不想分组的XML的其他部分中有G_1
元素时,才需要这样做)