您好我有一个问题,根节点和子节点在输出.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>
这为......输出正确但其余部分被忽略..
但是当我尝试将此代码与包含到子节点的元素合并时,它只会带来第一个结果集。我怎么能实现这个?
答案 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_1
对CM_DISTRICT
元素进行分组的要求。
另请注意,您不需要在模板匹配中指定G_1
元素的完整路径(如果您在其他部分中有G_1
个元素,则只需要这样做。您不想分组的XML。