1

我是 XSLT 的新手,我正在为我的问题寻求帮助。这是我的 XML 代码:

<?xml version="1.0" encoding="UTF-8"?>
    <nadrazi jmeno="Podlešín">
        <vlak typ="os" cislo="5112" z="Hostivice" cil="Podlešín" naVlak="53001">
            <prijezd>16:20:00</prijezd>
            <slozeni>
                <vuz cislo="1" oznaceniC="810" />
                <vuz cislo="2" oznaceniC="010" oznaceniT="Btax" />
            </slozeni>
        </vlak>
        <vlak typ="os" cislo="53001" z="Podlešín" smer="Zloněves" cil="Kralupy nad Vltavou" zVlaku="5112">
            <odjezd>17:00:00</odjezd>
            <slozeni>
                <vuz cislo="1" oznaceniC="810" />
                <vuz cislo="2" oznaceniC="010" oznaceniT="Btax" />
            </slozeni>
        </vlak>
        <vlak typ="sp" cislo="1389" z="Louny" smer="Zloněves" cil="Praha Holešovice">
            <prijezd>16:18:00</prijezd>
            <odjezd>16:23:00</odjezd>
            <slozeni>
                <vuz cislo="1" oznaceniC="843" />
                <vuz cislo="2" oznaceniT="Btn" />
                <vuz cislo="3" oznaceniT="Btn" />
            </slozeni>
        </vlak>
        <vlak typ="r" cislo="572" z="Praha Holešovice" smer="Slaný předměstí" cil="Chomutov">
            Nechranice
            <prijezd>14:27:00</prijezd>
            <odjezd>14:28:00</odjezd>
            <slozeni>
                <vuz cislo="0" oznaceniC="754" />
                <vuz cislo="250" oznaceniT="B" />
                <vuz cislo="251" oznaceniT="B" />
                <vuz cislo="252" oznaceniT="Bp" />
                <vuz cislo="253" oznaceniT="Bp" />
                <vuz cislo="254" oznaceniT="BDs" />
                <vuz cislo="255" oznaceniT="A" />
            </slozeni>
        </vlak>
    </nadrazi>

我想从所有元素vlak属性中获取一个smer值,从这些值中创建一个数组(或一个列表或类似的东西),然后使用类似unique()函数的东西来让每个重复值只有一个项目。在这种情况下,我的数组中将是“Zloněves”和“Slaný předměstí”。

这是我的 XSLT 代码。我尝试了一些方法来创建一些数组,但我失败并删除了那些行(前一段时间)。

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" />
    <xsl:template match="/">
<html>
<head>
    <title>Rozpis vlaků pro stanici <xsl:value-of select="nadrazi/@jmeno" /></title>
</head>
<script type="text/javascript">
function show(element) {
    var srcElement = document.getElementById(element);
    if(srcElement != null) {
        if(srcElement.style.display == "block") {
            srcElement.style.display= 'none';
        } else {
            srcElement.style.display='block';
        }
    return false;
    }
}
</script>
<body>
    <h1>Stanice <xsl:value-of select="nadrazi/@jmeno" /></h1>
    <xsl:apply-templates select="nadrazi" mode="smer" />
</body>
</html>
    </xsl:template>
    <xsl:template match="vlak" mode="smer">
    <div>
        <xsl:attribute name="id"><xsl:value-of select="@smer" /></xsl:attribute>
    </div>
    <xsl:apply-templates />
    </xsl:template>
</xsl:stylesheet>

输出将是 HTML 文件,其中数组的项目将是 div 的 id (div id="arrayItem")。现在输出是(时间和空间现在并不重要,但我会欢迎一些帮助(链接等)):

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Rozpis vlaků pro stanici Podlešín</title>
</head>
<script type="text/javascript">
function show(element) {
    var srcElement = document.getElementById(element);
    if(srcElement != null) {
        if(srcElement.style.display == "block") {
            srcElement.style.display= 'none';
        } else {
            srcElement.style.display='block';
        }
    return false;
    }
}
</script><body>
<h1>Stanice Podlešín</h1>
    <div id=""></div>
        16:20:00





    <div id="Zloněves"></div>
        17:00:00





    <div id="Zloněves"></div>
        16:18:00
        16:23:00






    <div id="Slaný předměstí"></div>
        Nechranice
        14:27:00
        14:28:00










</body>
</html>

我想要这个:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Rozpis vlaků pro stanici Podlešín</title>
</head>
<script type="text/javascript">
function show(element) {
    var srcElement = document.getElementById(element);
    if(srcElement != null) {
        if(srcElement.style.display == "block") {
            srcElement.style.display= 'none';
        } else {
            srcElement.style.display='block';
        }
    return false;
    }
}
</script><body>
<h1>Stanice Podlešín</h1>
    <div id="Zloněves"></div>
    <div id="Slaný předměstí"></div>
</body>
</html>

在这些 div 中,我将添加更多数据以及使用 Javascript 函数隐藏 div 所需的 id show(id)。并且所有具有 smer="Zloněves" 的元素将在一个中<div id="Zloněves">,所有具有 smer="Slaný předměstí" 的元素将在另一个中<div id="Slaný předměstí">

我发现了一些如何制作数组的问题,但没有解决这个问题。感谢帮助。

4

2 回答 2

2

这是一个分组问题,在 XSLT 1.0 中您需要使用一种称为Muenchain 分组的技术。

您正在按它们的smer属性对vlak元素进行分组,因此您可以像这样定义一个键:

<xsl:key name="vlak" match="vlak[@smer]" use="@smer" />

因此,对于给定值,键将返回其@smer属性等于该值的所有vlak元素。

现在,要获得不同的元素,您需要将键中首先出现的vlak元素与它们的给定@smer值相匹配。这样做是这样的:

<xsl:template match="vlak[generate-id() = generate-id(key('vlak', @smer)[1])]" mode="smer">

然后在此模板中,如果您愿意,要获取该组的所有vlak元素,只需访问密钥

<xsl:for-each select="key('vlak', @smer)">

您唯一需要的另一件事是一个模板来匹配其他vlak元素以阻止它们在此循环之外输出

<xsl:template match="vlak" mode="smer" />

这是完整的 XSLT(为简洁起见,我删除了 javascript)

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" />
    <xsl:key name="vlak" match="vlak[@smer]" use="@smer" />
    <xsl:template match="/">
<html>
<head>
    <title>Rozpis vlaků pro stanici <xsl:value-of select="nadrazi/@jmeno" /></title>
</head>
<body>
    <h1>Stanice <xsl:value-of select="nadrazi/@jmeno" /></h1>
    <xsl:apply-templates select="nadrazi" mode="smer" />
</body>
</html>
    </xsl:template>
    <xsl:template match="vlak[generate-id() = generate-id(key('vlak', @smer)[1])]" mode="smer">
    <div>
        <xsl:attribute name="id"><xsl:value-of select="@smer" /></xsl:attribute>
        <xsl:for-each select="key('vlak', @smer)">
        <xsl:value-of select="odjezd" />
        </xsl:for-each>
    </div>
    </xsl:template>

    <xsl:template match="vlak" mode="smer" />
</xsl:stylesheet>

当应用于您的 XML 时,将输出以下内容

<html>
<head>
<META http-equiv="Content-Type" content="text/html">
<title>Rozpis vlaků pro stanici Podlešín</title>
</head>
<body>
<h1>Stanice Podlešín</h1>
<div id="Zloněves">17:00:00 16:23:00</div>
<div id="Slaný předměstí">14:28:00</div>
</body>
</html>
于 2013-04-15T18:51:07.947 回答
0


,这里我没有给出完整的代码,只是给出了获取值的示例

<xsl:for-each select="nadrazi/vlak">
    <xsl:if test="@smer='Zloneves'">
      <div id =<xsl:value-of select="@smer"/>>
        <xsl:value-of select="prijezd"/>
         <xsl:value-of select="odjezd"/>
        </div>
    </xsl:if>
    </xsl:for-each>

在上面的例子中,我使用了 <xsl:if>元素<xsl:choose>

上述代码的示例输出将是

<div id=Zloněves></div>
        17:00:00

    <div id=Zloněves></div>
        16:18:00
        16:23:00
于 2013-04-15T13:22:45.303 回答