XSLT - 使用隧道传递变量未按预期工作
XSLT - Passing variables using Tunnel not working as expected
我对 XSLT 还很陌生。我在我的一个场景中使用 XSLT 2.0 隧道参数 - 我需要在一个组中获取 的第一个值,并放入 相同的所有节点。
下面是示例 XML 我正在使用 -
<?xml version='1.0' encoding='UTF-8'?>
<root>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS>2021-09-07T07:38:11.000</last_mod_dt_TS>
</row>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS>2021-10-10T17:32:44.000</last_mod_dt_TS>
</row>
</root>
XSLT 如下 -
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="#all">
<xsl:output indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:for-each-group select="row" group-by="request_Id">
<xsl:apply-templates select="current-group()">
<xsl:with-param name="slaStart" select="current-group()[1]/last_mod_dt_TS" tunnel="yes"/>
</xsl:apply-templates>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="last_mod_dt_TS">
<xsl:param name="slaStart" tunnel="yes"/>
<xsl:copy>
<xsl:value-of select="slaStart"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我的预期输出 -
<?xml version='1.0' encoding='UTF-8'?>
<root>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS>2021-09-07T07:38:11.000</last_mod_dt_TS>
</row>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS>2021-09-07T07:38:11.000</last_mod_dt_TS>
</row>
</root>
使用我的 XSLT -
<root>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS/>
</row>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS/>
</row>
</root>
我不确定为什么 XSLT 没有按预期工作。任何帮助深表感谢。
谢谢。
使用<xsl:value-of select="$slaStart"/>
输出并引用变量值
请注意,您根本不需要参数和隧道。 current group
和 current grouping key
通过 xsl:apply-templates
的调用不变地传递 - 所以你可以简单地做:
<xsl:template match="/root">
<xsl:copy>
<xsl:for-each-group select="row" group-by="request_Id">
<xsl:apply-templates select="current-group()"/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
然后:
<xsl:template match="last_mod_dt_TS">
<xsl:copy>
<xsl:value-of select="current-group()[1]/last_mod_dt_TS"/>
</xsl:copy>
</xsl:template>
我对 XSLT 还很陌生。我在我的一个场景中使用 XSLT 2.0 隧道参数 - 我需要在一个组中获取
下面是示例 XML 我正在使用 -
<?xml version='1.0' encoding='UTF-8'?>
<root>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS>2021-09-07T07:38:11.000</last_mod_dt_TS>
</row>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS>2021-10-10T17:32:44.000</last_mod_dt_TS>
</row>
</root>
XSLT 如下 -
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet
version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
exclude-result-prefixes="#all">
<xsl:output indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root">
<xsl:copy>
<xsl:for-each-group select="row" group-by="request_Id">
<xsl:apply-templates select="current-group()">
<xsl:with-param name="slaStart" select="current-group()[1]/last_mod_dt_TS" tunnel="yes"/>
</xsl:apply-templates>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="last_mod_dt_TS">
<xsl:param name="slaStart" tunnel="yes"/>
<xsl:copy>
<xsl:value-of select="slaStart"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
我的预期输出 -
<?xml version='1.0' encoding='UTF-8'?>
<root>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS>2021-09-07T07:38:11.000</last_mod_dt_TS>
</row>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS>2021-09-07T07:38:11.000</last_mod_dt_TS>
</row>
</root>
使用我的 XSLT -
<root>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS/>
</row>
<row>
<request_Id>4007</request_Id>
<req_tp>Action</req_tp>
<last_mod_dt_TS/>
</row>
</root>
我不确定为什么 XSLT 没有按预期工作。任何帮助深表感谢。 谢谢。
使用<xsl:value-of select="$slaStart"/>
输出并引用变量值
请注意,您根本不需要参数和隧道。 current group
和 current grouping key
通过 xsl:apply-templates
的调用不变地传递 - 所以你可以简单地做:
<xsl:template match="/root">
<xsl:copy>
<xsl:for-each-group select="row" group-by="request_Id">
<xsl:apply-templates select="current-group()"/>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
然后:
<xsl:template match="last_mod_dt_TS">
<xsl:copy>
<xsl:value-of select="current-group()[1]/last_mod_dt_TS"/>
</xsl:copy>
</xsl:template>