我正在尝试打印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="." />
它打印出所有元素,但当然是整个树结构。
我真的不想在这里问一下,并设法通过自己解决这个问题,但几个小时后我就扔掉了。
答案 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>