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
Xml 具有相同根节点名称的嵌套模板出现问题_Xml_Xslt - Fatal编程技术网

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:

您好,我有一个问题,根节点和子节点在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: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
元素时,才需要这样做)