2012-01-06 4 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

Так что же вы хотите, чтобы результат был? –

+1

И действительно ли это вход? Я подозреваю, что вы упускаете какой-то контекст. –

+0

Таким образом, он также выводит тип. home: 11111111 work: 23232323 cell: 95959595 – Dymond

ответ

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

oh my ..! конечно. Не знаю, почему у меня такая проблема, что я читал. нужно начинать писать заметки и проверять себя, вместо того, чтобы тратить время на то, чтобы придумать что-то новое :) Спасибо и благодарю всех вас за stackoverflow :) – Dymond

3

Похоже, что ваш контекст (где вы «стоите» в дереве узлов, когда эта часть, если выполняется XSLT) является родителем элементов <telefon>.

В вашем текущем коде, когда вы используете <xsl:value-of select="telefon/@typ"/>, XPath будет соответствовать всем трем атрибутам типа, но <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-each –

+0

и +1 для объяснения – Dymond

Смежные вопросы