2012-01-06 158 views
0

我试图打印出我的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="." />它打印出所有的元素,但整个球场的树结构。

我真的不想问这里,并设法通过我自己修复它,但几个小时后,我扔了毛巾。

+1

那么你究竟想要输出是什么? – 2012-01-06 23:37:40

+1

这真的是输入?我怀疑你正在抛弃一些背景。 – 2012-01-06 23:38:07

+0

所以它也输出类型。 家:11111111 工作:23232323 cell:95959595 – Dymond 2012-01-06 23:39:24

回答

2

您需要添加周围的一切<telefon>数据元素的循环。代码看起来像

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

哦我的..!当然。不知道为什么我有这样的麻烦记住我读的东西。需要开始写笔记和测试我的自我,而不是浪费时间试图发明新的东西:) 谢谢你,谢谢你在stackoverflow :) – Dymond 2012-01-07 00:04:33

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

+1以外的其他东西xsl:for-每个 – 2012-01-07 00:01:28

+0

和+1的说明 – Dymond 2012-01-07 00:09:50

相关问题