如何使用属性为Xml嵌套节点编写样式表?

时间:2016-01-01 14:46:01

标签: xml xslt

我的问题是在方向节点步骤中显示,例如在结尾处使用粗体和一些信息而不是“速度,时间和温度”标记。

XML数据示例

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="temp.xsl"?>
<records>
    <record>
        <title>Text for title</title>
        <category>Text for category</category>
        <info>Text for info</info>
        <author>Text for author</author>
        <directions>
            <step>Text for simple first step</step>
            <step>Text for complex second step with <time type="seconds">5</time> and <velocity type="clockwise">3</velocity></step>
            <step>Text for complex third step with <time type="minute">3</time> <temperature type="celsius">50</temperature> <velocity type="wheat">1</velocity> </step>
            <step>Text for medium fourth step with <temperature type="celsius">50</temperature> and nothing more</step>
        </directions>
        <notes>
            <note>Text for first note</note>
            <note>Text for second note</note>
        </notes>
    </record>
</records>

temp.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <html>
        <body>
            <xsl:apply-templates/>
        </body>
    </html>
</xsl:template>
<xsl:template match="record">
    <xsl:apply-templates select="category"/>
    <p>
        <xsl:apply-templates select="title"/>
        <xsl:apply-templates select="info"/>
        <xsl:apply-templates select="author"/>
    </p>
    <h3>Directions</h3>
    <p>
        <ul>
            <xsl:apply-templates select="directions"/>
        </ul>
    </p>
    <h3>Notes</h3>
    <p>
        <ul>
            <xsl:apply-templates select="notes"/>
        </ul>
    </p>
</xsl:template>
<xsl:template match="category">
    <h2>
        <xsl:value-of select="."/>
    </h2>
</xsl:template>
<xsl:template match="title">
    <h3>
        <xsl:value-of select="."/>
    </h3>
</xsl:template>
<xsl:template match="info">
    <xsl:value-of select="."/>
    <br />
</xsl:template>
<xsl:template match="author">
    Author:
    <xsl:value-of select="."/>
    <br />
</xsl:template>
<xsl:template match="directions/step">
    <li>
        <xsl:apply-templates select="time"/>
        <xsl:value-of select="."/>
    </li>
</xsl:template>
<xsl:template match="time">
    <b>time:
        <xsl:value-of select="."/>
    </b>
</xsl:template>
<xsl:template match="notes/note">
    <li>
        <xsl:value-of select="."/>
    </li>
</xsl:template>

html中的预期输出:

类别文字

标题文字

信息文字

  • 作者:作者的文字

路线

  • 简单第一步的文字
  • 复杂第二步的文字, 5秒顺时针速度5
  • 复杂第三步的文字, 3分钟 50°C 速度1小麦
  • 中等第四步的文字, 50°C ,仅此而已

备注

  • 第一个备注的文字
  • 第二个音符的文字

1 个答案:

答案 0 :(得分:3)

将符合directions/step的模板更改为:

<xsl:template match="directions/step">
    <li>
        <xsl:apply-templates/>
    </li>
</xsl:template>

然后添加单独的模板来处理timevelocitytemperature

<xsl:template match="time">
    <b>
        <xsl:value-of select="."/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="@type"/>
    </b>
</xsl:template>

<xsl:template match="velocity">
    <b>
        <xsl:text>Speed </xsl:text>
        <xsl:value-of select="."/>
        <xsl:text> </xsl:text>
        <xsl:value-of select="@type"/>
    </b>
</xsl:template>

<xsl:template match="temperature">
    <b>
        <xsl:value-of select="."/>
        <xsl:text>° </xsl:text>
        <xsl:value-of select="translate(substring(@type, 1, 1), 'cfk', 'CFK')"/>
    </b>
</xsl:template>

这样,上述三个文本节点的兄弟节点也将被处理。