我正在尝试匹配属性 audience =“ expert” 或 audience =“ novice”
并将其作为 class 属性和 audience 属性应用于html元素。
xml:
<section audience="expert" xml:id="section-1">
<title>Some Title</title>
<para audience="novice">Lorem ipsum dolore amet</para>
</section>
我的xslt模板:
<xsl:template mode="main" match="section">
<section class="d-inline-block">
<xsl:apply-templates/>
</section>
</xsl:template>
<xsl:template match="@audience">
<div>
<xsl:attribute name="audience">
<xsl:value-of select="@audience"/>
</xsl:attribute>
<xsl:apply-templates/>
</div>
</xsl:template>
预期输出:
<div class="audience" audience="expert">
Some Title
<div class="audience" audience="novice">
Lorem ipsum dolore amet
</div>
</div>
但是不会匹配。
当我匹配 para 时,它可以工作,但是我将用一个具有
属性的模板匹配section和para<xsl:template match="para">
<p>
<xsl:if test="@audience">
<xsl:attribute name="class">audience</xsl:attribute>
<xsl:attribute name="audience">
<xsl:value-of select="@audience"/>
</xsl:attribute>
</xsl:if>
<xsl:apply-templates/>
</p>
</xsl:template>
答案 0 :(得分:0)
问题在于您使用<xsl:apply-templates/>
。这是<xsl:apply-templates select="node()" />
的简写,其中node()
选择元素,文本节点,注释和处理指令。它不会选择属性。
您需要以此替换<xsl:apply-templates/>
,以便随后选择属性
<xsl:apply-templates select="@*|node()" />
还要注意,在已经定位到受众属性上的模板中,应该在匹配@audience
的模板中使用<xsl:value-of select="."/>
而不是<xsl:value-of select="@audience"/>
,所以只想获取当前值。 / p>
<xsl:template match="@audience">
<div>
<xsl:attribute name="audience">
<xsl:value-of select="."/>
</xsl:attribute>
<xsl:apply-templates/>
</div>
</xsl:template>
或者,更好的是,在此处使用属性值模板
<xsl:template match="@audience">
<div audience="{.}">
<xsl:apply-templates/>
</div>
</xsl:template>