根据变量值动态调用元素的XSLT正确语法



请告诉我如何使用动态调用输出元素的文本

源XML

<GTD>
  <LINE>
    <G44>
      <G441>
        02015
      </G441>
      <G442>
        12345
      </G442>
    </G44>
  </LINE>
</GTD>

我的xsl转换

<xsl:template match="/">
<GTD>
  <LINE>
    <VAR_1_1>
      <xsl:apply-templates select="../G44[G441 = '02015' or G441 = '02016' or G441 = '02017']">
        <xsl:with-param name="field" select="G441" />
      </xsl:apply-templates>
    </VAR_1_1>
    <VAR_1_2>
      <xsl:apply-templates select="../G44[G441 = '02015' or G441 = '02016' or G441 = '02017']">
        <xsl:with-param name="field" select="G442" />
      </xsl:apply-templates>
    </VAR_1_2>
  </LINE>
</GTD>
</xsl:template>
<xsl:template match="G44[G441 = '02015' or G441 = '02016' or G441 = '02017']">
  <xsl:param name="field"/>
  <xsl:value-of select="$field" />
</xsl:template>

我确实知道<xsl:value-of select="$field" />会给我变量的值,而不是名称等于变量值的元素的值。

所以,实际上我只需要正确的语法来动态调用元素的变量值

首先,您的参数将始终为空,因为您处于/根元素的上下文中,并且您正在选择一个节点。没有G441元素是/根节点的子元素,因此您没有选择任何内容。

你要做的是,你需要发送一个字符串作为参数,例如

<xsl:with-param name="field" select="'G441'" />

,然后提取值为:

<xsl:value-of select="*[name()=$field]" />

还要注意:

<xsl:apply-templates select="../G44[G441 = '02015' or G441 = '02016' or G441 = '02017']">

也不做任何事情。我想你的意思是:

<xsl:apply-templates select=".//G44[G441 = '02015' or G441 = '02016' or G441 = '02017']">

或(最好):

<xsl:apply-templates select="GTD/LINE/G44[G441 = '02015' or G441 = '02016' or G441 = '02017']">

恕我直言,您可以将整个内容简化为:

<xsl:template match="/GTD">
    <GTD>
      <LINE>
        <xsl:variable name="g44" select="LINE/G44[G441='02015' or G441='02016' or G441='02017']" />
        <VAR_1_1>
            <xsl:value-of select="$g44/G441" />
        </VAR_1_1>
        <VAR_1_2>
            <xsl:value-of select="$g44/G442" />
        </VAR_1_2>
      </LINE>
    </GTD>
</xsl:template>

最新更新