我的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>
在这种情况下,假设$subjectHasClass
为false
,$class
为"R"
,$owner
为"U"
。这是我的XML中的相关标记:
<ns1:SUBJECT>Title of document</SUBJECT>
我遇到的问题是我希望第一个模板中的apply-templates
获取我添加的新属性并在其上运行第二个模板。我认为它只是通过设计获取预先存在的属性,但我很好奇是否有办法解决这个限制或更好的设计模式在这里使用。
答案 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>
它将属性(新的或现有的)处理为临时节点并将其存储在变量中,然后我们将模板应用于该变量。