具有相同根节点名称

时间:2016-01-19 07:40:58

标签: xml xslt

您好我有一个问题,根节点和子节点在输出.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>

=============================================== === ======= 我试图将除G_1之外的所有元素组合在CM_DISTRICT值上,例如 CA ..... 因此,所有CA值CM_DISTRICT都归入此元素下。

=============================================== 我一直在使用以下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>

这为......输出正确但其余部分被忽略..

但是当我尝试将此代码与包含到子节点的元素合并时,它只会带来第一个结果集。我怎么能实现这个?

1 个答案:

答案 0 :(得分:0)

这里的关键是使用XSLT identity template,因为这会照顾复制您不需要修改的所有其他节点,但希望保留

<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>

注意我已将您的密钥简化为<xsl:key match="G_1" name="groups" use="CM_DISTRICT"/>,因为它可以更好地符合您按G_1CM_DISTRICT元素进行分组的要求。

另请注意,您不需要在模板匹配中指定G_1元素的完整路径(如果您在其他部分中有G_1个元素,则只需要这样做。您不想分组的XML。