apply-templates不会获取新属性

时间:2014-05-22 21:19:24

标签: xml xslt xslt-2.0

我的XSLT文件中有以下模板:

<xsl:template match="ns1:SUBJECT" mode="doc_copy">
  <xsl:copy>
    <xsl:if test="$subjectHasClass eq false()">
      <xsl:attribute name="ns2:class" select="$class"/>
    </xsl:if>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="@ns2:class[contains(., 'R')]">
  <xsl:choose>
    <xsl:when test="$owner ne 'U'">
      <xsl:attribute name="ns2:class" select="'R'"/>
    </xsl:when>
    <xsl:otherwise>
      <xsl:attribute name="ns2:class" select="'C'"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

在这种情况下,假设$subjectHasClassfalse$class"R"$owner"U"。这是我的XML中的相关标记:

<ns1:SUBJECT>Title of document</SUBJECT>

我遇到的问题是我希望第一个模板中的apply-templates获取我添加的新属性并在其上运行第二个模板。我认为它只是通过设计获取预先存在的属性,但我很好奇是否有办法解决这个限制或更好的设计模式在这里使用。

1 个答案:

答案 0 :(得分:1)

@ MatthewGreen的评论让我走上了回答的道路。我查找了在XSLT 2.0中进行多通道处理的方法,并提出了这个问题。

<xsl:template match="ns1:SUBJECT" mode="doc_copy">
  <xsl:variable name="subj-attrs">
    <temp>
      <xsl:choose>
        <xsl:when test="$subjectHasClass=false()">
          <xsl:attribute name="ns2:class" select="$class"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:apply-templates select="@*"/>
        </xsl:otherwise>
      </xsl:choose>
    </temp>
  </xsl:variable>
  <xsl:copy>
    <xsl:apply-templates select="$subj-attrs/temp/@*"/>
    <xsl:apply-templates select="node()"/>
  </xsl:copy>
</xsl:template>

它将属性(新的或现有的)处理为临时节点并将其存储在变量中,然后我们将模板应用于该变量。