XSL 按节点值分组
XSL group by node value
我有一个 XSL 键分组的案例。目标是根据 ID 匹配替换值。
输入:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<message-in>
<actions>
<stop>
<action id="33632">
<text>DefaultComment</text>
<planning-status>finished</planning-status>
<realised-times>
<starttime>2017-03-13T12:43:54</starttime>
<finishtime>2017-03-13T13:15:21</finishtime>
</realised-times>
</action>
</stop>
<stop>
<action id="33635">
<planning-status>started</planning-status>
<realised-times>
<starttime>2017-03-13T13:15:21</starttime>
</realised-times>
</action>
</stop>
</actions>
</message-in>
<output_getquerydata>
<queries>
<query name="fat">
<parameters>
<parameter name="id">33632</parameter>
</parameters>
<queryErrors/>
<queryResults>
<record id="1">
<column name="interfaceAction_externalId">33633OREA</column>
</record>
</queryResults>
</query>
</queries>
</output_getquerydata>
<output_getquerydata>
<queries>
<query name="fat">
<parameters>
<parameter name="id">33635</parameter>
</parameters>
<queryErrors/>
<queryResults>
<record id="1">
<column name="interfaceAction_externalId">536313OREA</column>
</record>
</queryResults>
</query>
</queries>
</output_getquerydata>
</root>
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" omit-xml-declaration="no" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:key name="actionKey" match="stop" use="action/@id"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<root>
<xsl:copy-of select="//message-in"/>
</root>
</xsl:template>
<xsl:template match="action/@id">
<xsl:attribute name="id"><xsl:value-of select="substring-before(//output_getquerydata/queries/query/parameters/parameter[key('actionKey', @id)]/queryResults/record/column[@name='interfaceAction_externalId'],'OREA')"/></xsl:attribute>
</xsl:template>
</xsl:stylesheet>
我有多个 "action" 个节点匹配 "query" 个节点。
目标是对于每个操作 ID,我们需要将 "action" 标记中的 ID 值替换为相应的 "interfaceAction_externalId" 值。
因此,对于操作 ID 33632,我们将复制并替换为“33633”的值(因为我们在 parameneter/name/@id 33632 = action/@id 中有一个匹配项)。
复制效果很好我得到了我需要的所有信息,但似乎 action/@id 没有被替换。
我想我会使用一个键来保存 action/@id 的值,然后在模板匹配中使用它来替换 interfaceAction_externalId 中的值,但它不起作用,我不确定是什么我做错了。
感谢您的帮助!
只有当您使用 <xsl:apply-templates select="//message-in"/>
而不是 <xsl:copy-of select="//message-in"/>
时,整个方法才有意义。
关于使用密钥,我想你想要
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:key name="ref-query"
match="output_getquerydata/queries/query/queryResults/record/column[@name='interfaceAction_externalId']"
use="ancestor::query/parameters/parameter[@name = 'id']"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<root>
<xsl:apply-templates select="//message-in"/>
</root>
</xsl:template>
<xsl:template match="action/@id">
<xsl:attribute name="id"><xsl:value-of select="substring-before(key('ref-query', .),'OREA')"/></xsl:attribute>
</xsl:template>
</xsl:stylesheet>
我有一个 XSL 键分组的案例。目标是根据 ID 匹配替换值。
输入:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<message-in>
<actions>
<stop>
<action id="33632">
<text>DefaultComment</text>
<planning-status>finished</planning-status>
<realised-times>
<starttime>2017-03-13T12:43:54</starttime>
<finishtime>2017-03-13T13:15:21</finishtime>
</realised-times>
</action>
</stop>
<stop>
<action id="33635">
<planning-status>started</planning-status>
<realised-times>
<starttime>2017-03-13T13:15:21</starttime>
</realised-times>
</action>
</stop>
</actions>
</message-in>
<output_getquerydata>
<queries>
<query name="fat">
<parameters>
<parameter name="id">33632</parameter>
</parameters>
<queryErrors/>
<queryResults>
<record id="1">
<column name="interfaceAction_externalId">33633OREA</column>
</record>
</queryResults>
</query>
</queries>
</output_getquerydata>
<output_getquerydata>
<queries>
<query name="fat">
<parameters>
<parameter name="id">33635</parameter>
</parameters>
<queryErrors/>
<queryResults>
<record id="1">
<column name="interfaceAction_externalId">536313OREA</column>
</record>
</queryResults>
</query>
</queries>
</output_getquerydata>
</root>
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" omit-xml-declaration="no" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:key name="actionKey" match="stop" use="action/@id"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<root>
<xsl:copy-of select="//message-in"/>
</root>
</xsl:template>
<xsl:template match="action/@id">
<xsl:attribute name="id"><xsl:value-of select="substring-before(//output_getquerydata/queries/query/parameters/parameter[key('actionKey', @id)]/queryResults/record/column[@name='interfaceAction_externalId'],'OREA')"/></xsl:attribute>
</xsl:template>
</xsl:stylesheet>
我有多个 "action" 个节点匹配 "query" 个节点。 目标是对于每个操作 ID,我们需要将 "action" 标记中的 ID 值替换为相应的 "interfaceAction_externalId" 值。 因此,对于操作 ID 33632,我们将复制并替换为“33633”的值(因为我们在 parameneter/name/@id 33632 = action/@id 中有一个匹配项)。
复制效果很好我得到了我需要的所有信息,但似乎 action/@id 没有被替换。 我想我会使用一个键来保存 action/@id 的值,然后在模板匹配中使用它来替换 interfaceAction_externalId 中的值,但它不起作用,我不确定是什么我做错了。
感谢您的帮助!
只有当您使用 <xsl:apply-templates select="//message-in"/>
而不是 <xsl:copy-of select="//message-in"/>
时,整个方法才有意义。
关于使用密钥,我想你想要
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="utf-8"/>
<xsl:strip-space elements="*"/>
<xsl:key name="ref-query"
match="output_getquerydata/queries/query/queryResults/record/column[@name='interfaceAction_externalId']"
use="ancestor::query/parameters/parameter[@name = 'id']"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/">
<root>
<xsl:apply-templates select="//message-in"/>
</root>
</xsl:template>
<xsl:template match="action/@id">
<xsl:attribute name="id"><xsl:value-of select="substring-before(key('ref-query', .),'OREA')"/></xsl:attribute>
</xsl:template>
</xsl:stylesheet>