在另一个中使用来自一个XSLT转换的结果

时间:2017-04-10 14:51:11

标签: xml xslt

我是XSLT(2.0)的新手,我遇到了以下情况。我有XML输入,如下所示:

<root>
    <elem name="elemName1">
         <subel1>value</subel1>  
         <subel1>value2</subel1>  
    </elem>
    <elem name="elemName2">
         <subel1>value</subel1>  
         <subel1>value2</subel1>  
    </elem>
    <elem name="elemName3">
         <subel2>value</subel2>  
         <subel2>value2</subel2>  
    </elem>

    <referencing>
         <something type="elemName1"/>
    </referencing>
    <referencing>
         <something type="elemName2"/>
    </referencing>
    <referencing>
         <something type="elemName3"/>
    </referencing>
</root>

我需要两件事:

  1. <elem>中包含<subel1>的所有elemNameX元素的属性名称更改为newelemNameX
  2. 更改所有<something>的{​​{1}}属性以引用这些新名称。
  3. 我设法做了第一步,但我在第二步

    我正在考虑浏览所有type并尝试查找\\something\@type。但我无法匹配第一步中创建的修改后的\\elem[@name='newelemX']

    是否可以匹配不同模板中一个模板的结果?

1 个答案:

答案 0 :(得分:0)

  

我正在考虑通过所有\ something \ @type并尝试查找   \ ELEM [@name =&#39; newelemX&#39]。但我无法匹配修改后创建的   第一步。

     

是否可以匹配不同模板中一个模板的结果?

如果您已将模板评估结果分配给变量,那么可以(在XSLT 2.0中)。例如,您可以通过将模板应用于变量中记录的节点序列来执行此操作。但是,如果您愿意允许重复逻辑,那么您就不需要遇到这种麻烦。您甚至可以在XSLT 1.0中执行

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <!-- Identity transform for where there is no more specific match -->
  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
  </xsl:template>

  <!-- modified "name" attributes for certain "elem" elements -->    
  <xsl:template match="elem[subel1]/@name">
    <xsl:attribute name="name">new<xsl:value-of select="."/></xsl:attribute>
  </xsl:template>

  <!-- "type" attributes of "something" elements -->    
  <xsl:template match="something/@type">
    <!-- need to capture the current value for use in a test expression -->
    <xsl:variable name="current_value" select="." />
    <xsl:attribute name="type">
      <!-- insert "new" into the value where needed (logic duplicated here) -->
      <xsl:if test="/descendant::elem[@name=$current_value]/subel1">new</xsl:if>
      <xsl:value-of select="."/>
    </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>