XSLT - 使用隧道传递变量未按预期工作

Posted

技术标签:

【中文标题】XSLT - 使用隧道传递变量未按预期工作【英文标题】:XSLT - Passing variables using Tunnel not working as expected 【发布时间】:2021-11-30 06:23:54 【问题描述】:

我对 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 没有按预期工作。任何帮助深表感谢。 谢谢。

【问题讨论】:

您的模板应该有&lt;xsl:value-of select="$slaStart"/&gt;(变量/参数名称前有$符号)。 【参考方案1】:

请注意,您根本不需要参数和隧道。 current groupcurrent 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>

【讨论】:

【参考方案2】:

使用&lt;xsl:value-of select="$slaStart"/&gt;输出并引用变量值。

【讨论】:

以上是关于XSLT - 使用隧道传递变量未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

mycursor.executemany 更新未按预期工作

@State var 在 LazyVGrid 中未按预期更新

箱线图(ggplot2)未按预期工作

变量未按预期运行

变量未按预期运行

变量未按预期运行