XSLT:如何将标识转换的输出复制到xslt变量?

时间:2018-09-12 08:38:06

标签: xml xslt

使用以下代码,我将XML输入中出现的所有元素QUOTE替换为一个字符串,该字符串是QUOTE / @ ID属性的值。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="QUOTE">
      <xsl:value-of select="@ID"/>
  </xsl:template>

</xsl:stylesheet>

现在,我想将上述转换的输出复制到变量中,以将其作为模板中的参数传递,然后像这样将XPATH应用于此变量:

<xsl:template name="second-pass">
    <!-- variable which holds the identity transformation -->   
    <xsl:param name="pre-processed-xml"/>
    <!-- call SUMMARY template with parameter -->      
    <xsl:call-template name="SUMMARY">
        <xsl:with-param name="pre-processed-xml" select="exsl:node-set($pre-processed-xml)"/>
    </xsl:call-template>
</xsl:template>

<!-- SUMMARY template -->
<xsl:template name="SUMMARY">
   <xsl:param name="pre-processed-xml"/>
   <xsl:value-of select="$pre-processed-xml//SUMMARY"> 
</xsl:template>

我的问题如下:

  1. 如何将身份转换的输出复制到     变量?
  2. 如何在身份识别后调用“第二遍”模板 转换完成并复制到变量中?

1 个答案:

答案 0 :(得分:0)

您可以做的就是简单地匹配文档节点/,然后将xsl:apply-templates的结果存储在变量中,然后将其传递给second-pass模板

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exsl="http://exslt.org/common">
  <xsl:template match="/">
    <xsl:variable name="doc">
      <xsl:apply-templates />
    </xsl:variable>
    <xsl:call-template name="second-pass">
      <xsl:with-param name="pre-processed-xml" select="$doc" />
    </xsl:call-template>
  </xsl:template>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="QUOTE">
    <xsl:value-of select="@ID"/>
  </xsl:template>

  <xsl:template name="second-pass">
    <!-- variable which holds the identity transformation -->   
    <xsl:param name="pre-processed-xml"/>
    <!-- call SUMMARY template with parameter -->      
    <xsl:call-template name="SUMMARY">
      <xsl:with-param name="pre-processed-xml" select="exsl:node-set($pre-processed-xml)"/>
    </xsl:call-template>
  </xsl:template>

  <!-- SUMMARY template -->
  <xsl:template name="SUMMARY">
    <xsl:param name="pre-processed-xml"/>
    <xsl:value-of select="$pre-processed-xml//SUMMARY" /> 
  </xsl:template>
</xsl:stylesheet>

话虽如此,这似乎有点过头了。鉴于您在问题中所显示的内容,只需执行此操作即可获得相同的结果。...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:apply-templates select="//SUMMARY" />
  </xsl:template>

  <xsl:template match="QUOTE">
    <xsl:value-of select="@ID"/>
  </xsl:template>
</xsl:stylesheet>