严重打印出 XSL 转换

  • 本文关键字:XSL 转换 打印 xml xslt
  • 更新时间 :
  • 英文 :


我有以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="university_students.css" ?>
<university>
    <students>
        <student sid="sckl9999">
            <name>Schmitt</name>
            <firstname>Klaus</firstname>
            <courses>
                <course cid="IM120">
                    <grade attempt="1" term="WS13" type="simple">4.7</grade>
                        <grade attempt="2" term="SS14" type="simple">5.0</grade>
                            <grade attempt="3" term="WS14" type="simple">1.3</grade>
                </course>
                <course cid="IM130">
                    <grade attempt="1" term="SS14" type="complex">2.1</grade>
                        <course cid="IM131">
                            <grade attempt="1" term="WS14" type="simple">2.2</grade>
                        </course>
                        <course cid="IM132">
                            <grade attempt="1" term="SS14" type="simple">2.3</grade>
                        </course>
                        <course cid="IM133">
                            <grade attempt="1" term="WS14" type="simple">2.0</grade>
                        </course>
                </course>
                <course cid="IM140">
                    <grade attempt="1" term="WS14" type="simple">1.7</grade>
                </course>
            </courses>
        </student>
        <student sid="sckl9999">
            <name>Putin</name>
            <firstname>Wladimir</firstname>
            <courses>
                <course cid="IM120">
                    <grade attempt="1" term="WS14" type="simple">1.7</grade>
                </course>
                <course cid="IM130">
                    <grade attempt="1" term="SS14" type="complex">2.3</grade>
                    <course cid="IM131">
                        <grade attempt="2" term="WS14" type="simple">2.3</grade>
                    </course>
                    <course cid="IM132">
                        <grade attempt="1" term="SS14" type="simple">2.7</grade>
                    </course>
                    <course cid="IM133">
                        <grade attempt="1" term="WS14" type="simple">2.7</grade>
                    </course>
                </course>
                <course cid="IM140">
                    <grade attempt="1" term="WS14" type="simple">1.7</grade>
                </course>
            </courses>
        </student>
        <student sid="sckl9999">
            <name>Merkel</name>
            <firstname>Angela</firstname>
            <courses>
                <course cid="IM120">
                    <grade attempt="1" term="SS14" type="simple">1.0</grade>
                </course>
                <course cid="IM130">
                    <grade attempt="1" term="SS14" type="complex">1.1</grade>
                    <course cid="IM131">
                        <grade attempt="1" term="WS14" type="simple">1.3</grade>
                    </course>
                    <course cid="IM132">
                        <grade attempt="1" term="SS14" type="simple">2.3</grade>
                    </course>
                    <course cid="IM133">
                        <grade attempt="1" term="WS14" type="simple">1.3</grade>
                    </course>
                </course>
                <course cid="IM140">
                    <grade attempt="1" term="WS14" type="simple">2.0</grade>
                </course>
            </courses>
        </student>
    </students>
</university>

以及以下 XSLT 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:template match="/">
        <html>
            <body>
                <h2>Following errors were found:</h2>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="grade[@type='simple']">
            <xsl:if test="not(.='1.0' or .='1.3' or .='1.7' or .='2.0' or .='2.3' or .='2.7' or .='3.0' or .='3.3' or .='3.7' or .='4.0' or .='4.3' or .='4.7' or .='5.0')">
                <h3>
                    Simple grade <xsl:value-of select="."/> not correct in course <xsl:value-of select="../@cid" /> under term <xsl:value-of select="@term" /> at attempt <xsl:value-of select="@attempt" />.
                </h3>
            </xsl:if>
    </xsl:template>
</xsl:stylesheet>

此 XSLT 应检查 XML 文件中的任何等级,直到它具有"simple"类型,然后它应检查值是否适合 if 语句。我的问题是,我得到以下输出:

Following errors were found:
Schmitt Klaus 2.1
Simple grade 2.2 not correct in course IM131 under term WS14 at attempt 1.
Putin Wladimir 2.3 Merkel Angela 1.1

第三行是我需要的,但为什么还有第二行和第四行我并不真正需要?我有没有搞错,你能纠正一下吗?

提前谢谢你。

由于您似乎关心编写"严肃的"XSLT,因此您还应该

  • 始终在xsl:text内输出文字文本内容,以便始终控制将哪些字符写入输出树
  • 也许将所有允许的成绩值放在一个变量中并将它们存储为序列
  • 正如 LEU 已经建议的那样,添加空模板匹配text()以覆盖内置模板
  • 显式声明输出方法html并使用strip-space来摆脱所有仅空格的文本节点

XSLT 样式表

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <html>
            <body>
                <h2>Following errors were found:</h2>
                <xsl:apply-templates/>
            </body>
        </html>
    </xsl:template>
    <xsl:template match="grade[@type='simple']">
            <xsl:variable name="allowed-grades" select="('1.0','1.3','1.7','2.0','2.3','2.7','3.0','3.3','3.7','4.0','4.3','4.7','5.0')"/>
            <xsl:if test="not(string(.) = $allowed-grades)">
                <h3>
                    <xsl:text>Simple grade </xsl:text>
                    <xsl:value-of select="."/>
                    <xsl:text> not correct in course </xsl:text>
                    <xsl:value-of select="../@cid" />
                    <xsl:text> under term </xsl:text>
                    <xsl:value-of select="@term" />
                    <xsl:text> at attempt </xsl:text>
                    <xsl:value-of select="@attempt" />
                    <xsl:text>.</xsl:text>
                </h3>
            </xsl:if>
    </xsl:template>
    <xsl:template match="text()"/>
</xsl:stylesheet>

网页输出

<html>
   <body>
      <h2>Following errors were found:</h2>
      <h3>Simple grade 2.2 not correct in course IM131 under term WS14 at attempt 1.</h3>
   </body>
</html>

不相关,但"发现以下错误:"在我看来不是语法英语句子。您必须使用"发现以下错误:"

内置模板打印出输入 XML 的文本节点。由于 XSL 没有针对文本节点的显式规则,因此将打印它们。

知道了这一点,我们可以轻松避免那些您不想要的字符串。只需添加此模板

<xsl:template match="text()"/>

最新更新