XSLT匹配属性并应用CSS

时间:2018-09-20 08:12:53

标签: html xml xslt

我正在尝试匹配属性 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>

1 个答案:

答案 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>