【发布时间】:2015-04-10 06:09:43
【问题描述】:
我必须使用 Oracle Service Bus 在 xslt 1.0 中对 xml 文档进行分组。
这是示例输入文件(简体):
<?xml version="1.0" encoding="UTF-8"?>
<EMailData>
<property name="A">
<property name="B">
<property name="C">
<row>
<property name="C1">
<value>ValC1</value>
</property>
<property name="C2">
<value>ValC2</value>
</property>
<property name="C3">
<value>Valc3</value>
</property>
<property name="C4">
<value>Valc4</value>
</property>
</row>
</property>
<property name="C">
<row>
<property name="C1">
<value>ValC1</value>
</property>
<property name="C2">
<value>ValC2</value>
</property>
<property name="C3">
<value>Valc3</value>
</property>
<property name="C4">
<value>Valc4</value>
</property>
</row>
</property>
<property name="D">
<row>
<property name="D1">
<value>ValD1</value>
</property>
<property name="D2">
<value>VALd2</value>
</property>
<property name="D3-InnerElement"> //Need to Group this too
<row>
<property name="Status">
<value>Status122</value>
</property>
</row>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status123</value>
</property>
</row>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status124</value>
</property>
</row>
</property>
</row>
</property>
<property name="D">
<row>
<property name="D1">
<value>ValD1</value>
</property>
<property name="D2">
<value>VALd2</value>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status122</value>
</property>
</row>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status123</value>
</property>
</row>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status124</value>
</property>
</row>
</property>
</row>
</property>
</property>
</property>
</EMailData>
我的 XSLT 逻辑:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:key name="group" match="/*/*/*/property" use="@name"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*/*[property[@name]]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each select="*[generate-id() = generate-id(key('group', @name)[1])]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="key('group', @name)/*"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
<!--Change for Inner Hierarchy-->
<xsl:key name="inner-group" match="/*/*/*/*/property" use="@name"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*/*/*[property[@name]]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:for-each select="*[generate-id() = generate-id(key('inner-group', @name)[1])]">
<xsl:copy>
<xsl:copy-of select="@*"/>
<xsl:apply-templates select="key('inner-group', @name)/*"/>
</xsl:copy>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
预期 o/p
<?xml version="1.0" encoding="UTF-8"?>
<EMailData>
<property name="A">
<property name="B">
<property name="C">
<row>
<property name="C1">
<value>ValC1</value>
</property>
<property name="C2">
<value>ValC2</value>
</property>
<property name="C3">
<value>Valc3</value>
</property>
<property name="C4">
<value>Valc4</value>
</property>
</row>
<row>
<property name="C1">
<value>ValC1</value>
</property>
<property name="C2">
<value>ValC2</value>
</property>
<property name="C3">
<value>Valc3</value>
</property>
<property name="C4">
<value>Valc4</value>
</property>
</row>
</property>
<property name="D">
<row>
<property name="D1">
<value>ValD1</value>
</property>
<property name="D2">
<value>VALd2</value>
</property>
<property name="D3-InnerElement"> //Need to Group this too
<row>
<property name="Status">
<value>Status122</value>
</property>
</row>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status123</value>
</property>
</row>
<row>
<property name="Status">
<value>Status124</value>
</property>
</row>
</property>
</row>
<row>
<property name="D1">
<value>ValD1</value>
</property>
<property name="D2">
<value>VALd2</value>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status122</value>
</property>
</row>
<row>
<property name="Status">
<value>Status123</value>
</property>
</row>
<row>
<property name="Status">
<value>Status124</value>
</property>
</row>
</property>
</row>
</property>
</property>
</property>
</EMailData>
但是 D3-innerelement 没有分组。告诉我哪里出错了!!
o/p 对于我的 XSLT
<?xml version="1.0" encoding="UTF-8"?>
<EMailData>
<property name="A">
<property name="B">
<property name="C">
<row>
<property name="C1">
<value>ValC1</value>
</property>
<property name="C2">
<value>ValC2</value>
</property>
<property name="C3">
<value>Valc3</value>
</property>
<property name="C4">
<value>Valc4</value>
</property>
</row>
<row>
<property name="C1">
<value>ValC1</value>
</property>
<property name="C2">
<value>ValC2</value>
</property>
<property name="C3">
<value>Valc3</value>
</property>
<property name="C4">
<value>Valc4</value>
</property>
</row>
</property>
<property name="D">
<row>
<property name="D1">
<value>ValD1</value>
</property>
<property name="D2">
<value>VALd2</value>
</property>
<property name="D3-InnerElement"> //Need to Group this too
<row>
<property name="Status">
<value>Status122</value>
</property>
</row>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status123</value>
</property>
</row>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status124</value>
</property>
</row>
</property>
</row>
<row>
<property name="D1">
<value>ValD1</value>
</property>
<property name="D2">
<value>VALd2</value>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status122</value>
</property>
</row>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status123</value>
</property>
</row>
</property>
<property name="D3-InnerElement">
<row>
<property name="Status">
<value>Status124</value>
</property>
</row>
</property>
</row>
</property>
</property>
</property>
</EMailData>
提前致谢!
【问题讨论】:
-
除了发布你的预期输出,你能用文字解释你想要做什么吗?理解样式表需要一些时间。
-
我只想将特定元素内的所有单独的行分组到一个元素本身之下。如中,不重复元素 C。只需按行分隔它们。这必须进一步深入到内部的元素。这就是问题发生的地方
-
解释不够。您能否尝试详细说明。另外,我看不到您的输入和预期输出是同步的,例如,我可以在预期输出中看到
Status133作为文本节点,但在输入中看不到。你能不能也解决这个问题。 -
我已经编辑了代码。我现在清楚了吗?我只需要对元素 C 和 D 进行分组。在它们下面有多行。我可以使用 XSLT 逻辑来做到这一点。但是元素 D 有另一个元素(D3-InnerElement),它必须以相同的方式分组。我的代码没有解决这个问题。请纠正我。
-
HeisenBerg,这个问题有什么联系:stackoverflow.com/questions/28429646/…?
标签: xslt-1.0 muenchian-grouping