读取具有相同名称但属性不同的元素

时间:2012-01-06 23:34:05

标签: xml xslt

我正在尝试打印XML文件中人员的电话号码。

这些是我要打印的元素

<telefon typ="home">11111111</telefon>
<telefon typ="work">23232323</telefon>
<telefon typ="cell">95959595</telefon>

但我只设法打印出其中一个。当然是第一个。

这是我的XSL文件

 <?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h1>Lista över <xsl:value-of select="count(/*/*/namn)"/> personer</h1><br />
<xsl:for-each select="//person[namn]" >
<h2>Person
<xsl:value-of select="position()" />
<xsl:text>: </xsl:text>
<xsl:value-of select="namn" /></h2>
<h3>Kontaktuppgifter: </h3>
Gata: <xsl:value-of select="adress/gata" />
<br />
Postnr: <xsl:value-of select="adress/postnr" />
<xsl:text> </xsl:text>
<xsl:value-of select="adress/postort" />
<br />
<br />
<xsl:element name="telefon">
<xsl:value-of select="telefon/@typ" /> 
<xsl:text>: </xsl:text> 
<xsl:value-of select="telefon" />
</xsl:element>
<hr />
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

如果我将最后一个元素改为这样的东西
<xsl:value-of select="." />它打印出所有元素,但当然是整个树结构。

我真的不想在这里问一下,并设法通过自己解决这个问题,但几个小时后我就扔掉了。

2 个答案:

答案 0 :(得分:3)

看起来您的上下文(如果XSLT正在执行时,您在此节目树中“站立”)是<telefon>元素的父级。

在您当前的代码中,当您使用<xsl:value-of select="telefon/@typ"/>时,XPath将匹配所有三个typ属性,但<xsl:value-of>将返回它遇到的第一个属性。

当您使用<xsl:value-of select="."/>时,您将获得当前节点(<telefon>元素的父节点)的计算字符串值,这将是所有text()的串联节点

你会想要这样的东西:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output indent="yes" />

<!--assuming that the document element is the parent element of the telefon elements -->
    <xsl:template match="/*">
        <xsl:apply-templates select="telefon"/>
    </xsl:template>


    <xsl:template match="telefon">
        <!--xsl:copy will do what xsl:element name="telefon" was doing-->
        <xsl:copy>
            <!--select this telefon element's typ attribute value-->
            <xsl:value-of select="@typ"/>
            <xsl:text>: </xsl:text>
            <!--now that the context is the telefon element, value of . will yield expected result -->
            <xsl:value-of select="."/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

答案 1 :(得分:2)

您需要在所有<telefon>数据元素周围添加循环。代码看起来像

<xsl:for-each select="telefon" >
    <xsl:value-of select="@typ" /> 
    <xsl:text>: </xsl:text> 
    <xsl:value-of select="." />
    <br/>
</xsl:for-each>