Avatar billede mik789 Nybegynder
07. april 2004 - 17:57 Der er 14 kommentarer og
1 løsning

position() uden for-each

Man ser ofte dette (eller tilsvarende) eksempel på brugen af position():

    <xsl:for-each select="catalog/cd">
      <xsl:value-of select="title"/>
      <xsl:if test="position() < last()-1">
        <xsl:text>, </xsl:text>
      </xsl:if>
      <xsl:if test="position()=last()-1">
        <xsl:text>, and </xsl:text>
      </xsl:if>
      <xsl:if test="position()=last()">
        <xsl:text>!</xsl:text>
      </xsl:if>
    </xsl:for-each>

Men kan man gøre noget lignende uden for-each, f.eks.:

<xsl:template match="item">
[...]
      <xsl:if test="editor">
        <xsl:text>udgivet af </xsl:text>
        <xsl:value-of select="editor"/>
        <xsl:if test="position()=last()-1">
          <xsl:text> og </xsl:text>
        </xsl:if>
        <xsl:if test="position()=last()">
          <xsl:text>, </xsl:text>
        </xsl:if>
      </xsl:if>
[...]
</xsl:template>

Vil parseren vide at position() går på elementet "editor" og ikke på andre afkom af elementet "item"?

//mik
Avatar billede atoft Nybegynder
07. april 2004 - 18:13 #1
Position vil i ovenstående eksempel kører på item - elementet, da det er over nodeset'et med items templaten itererer.

Så den kan ikke går ikke, men hvordan ser din xml ud?
Avatar billede mik789 Nybegynder
07. april 2004 - 18:35 #2
atoft> xml f.eks.:

<item>
<piece>Untouchables, Women and Territories: Rituals of lordship in Par&#x101;&#x15b;arasmrti</piece>
<book>Invented Identities: The interplay of gender, religion and politics in India</book>
<editor>Julia Leslie</editor><editor>Mary McGee</editor>
<series>SOAS Studies on South Asia: Understanding and Perspectives</series>
<series_editor>Peter Robb</series_editor>
<pub_place>Delhi</pub_place>
<pub_house>Oxford University Press</pub_house>
<pub_year>2000</pub_year>
<pages>133-156</pages>
</item>
Avatar billede mik789 Nybegynder
07. april 2004 - 18:50 #3
hov, jeg havde glemt at afsætte point...
Avatar billede atoft Nybegynder
07. april 2004 - 19:17 #4
så kan du jo evt lave følgende.

<xsl:template match="item">
[...]
      <xsl:if test="editor">
        <xsl:text>udgivet af </xsl:text>
        <xsl:apply-template select="editor"/>
      </xsl:if>
[...]
</xsl:template>

<xsl:template match="editor">

        <xsl:if test="position()=last()-1">
          <xsl:text> og </xsl:text>
        </xsl:if>
        <xsl:if test="position()=last()">
          <xsl:text>, </xsl:text>
        </xsl:if>
</xsl:template>
Avatar billede mik789 Nybegynder
07. april 2004 - 22:57 #5
atoft> ok, så er der noget jeg har misforstået, for jeg troede at position() altid går på et elements underordnede noder, dvs. f.eks. på "editor" i template match="item", men ikke på "editor" i template match="editor". Eller er det sådan at en template match altid ses fra den den overordnede node?

Beklager, men er en smule forvirret her...
Avatar billede mik789 Nybegynder
08. april 2004 - 07:07 #6
atoft>men bort set fra at jeg ikke helt forstår hvorfor det virker, så virker det jo og har løst problemet, så læg bare et svar ;-)
Avatar billede nute Nybegynder
08. april 2004 - 10:44 #7
mik789 >> position() angiver positionen på den node, du står på, i hierarkiet. eller som det sngives på engelsk:

"Returns the position in the node list of the node that is currently being processed"


et hurtig eksempel kan illustrere.

xml:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <node>
        <sub/>
        <sub/>
        <sub/>
    </node>
    <node>
        <sub/>
        <sub/>
        <sub/>
    </node>
</root>

xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
    <xsl:template match="node">
        <b>node</b>: <xsl:value-of select="position()"/><br/>
        <xsl:apply-templates />
    </xsl:template>
    <xsl:template match="sub">
        <b>sub</b>: <xsl:value-of select="position()"/><br/>
    </xsl:template>
</xsl:stylesheet>

kør denne tranformation og se selv.

hvis du ikke har fundet ud af funktionen i xmlspy endnu, så er her et lille trick:

- opret xml dokument og klistre xml koden ind
- opret xsl dokument og klistre xsl koden ind
- ha dit xml dokument åbent (så du ser koden), tryk F10, vælg window og vælg den xsl du lige oprettet og vupti, så er resultatet af transformationen tilgængelig ;o]
Avatar billede nute Nybegynder
08. april 2004 - 10:52 #8
i dette eksempel ville jeg nok have skrevet templaten til editor en lille smule anderledes:

<xsl:template match="editor">
        <xsl:value-of select="."/>
        <xsl:choose>
            <xsl:when test="position()=last()-1"> og </xsl:when>
            <xsl:when test="position() &lt; last()">, </xsl:when>
            <xsl:otherwise/>
        </xsl:choose>
    </xsl:template>

hvis der er 2 editorer, vil resultatet være

editor1 og editor2

hvis der er flere editorer, vil resultatet være:

editor1, editor2, editor3, ... , editor-n og editor-(n+1)

/nute
Avatar billede mik789 Nybegynder
10. april 2004 - 08:05 #9
nute> ja, jeg kan se det virker. Jeg havde misforstået det i starten pga nogle bemærkninger i min xml bog (Elizabeth Castro, _XML til WWW_, bemærkningen til Fig. 12.5, s.165). Her ser det ud som om hun mener at position() går på en nodes undernoder, selv om hendes kode viser at den (som du siger) viser den node hen står på.

Ja, det er rigtigt, hvis der er flere editors skal betingelserne formuleres anderledes. Her har jeg bare valgt kun at tage udgangspunkt i den aktuelle bibliografi (der højst har 2 editors ad gangen).
Avatar billede mik789 Nybegynder
10. april 2004 - 08:07 #10
atoft> vil du have nogle points?
Avatar billede mik789 Nybegynder
11. april 2004 - 12:19 #11
nute> atoft vil åbenbart ikke have points, vil du have dem?
Avatar billede nute Nybegynder
11. april 2004 - 13:39 #12
nææ ... det er vel fair at den, der løser problemet, får points. Han er sikkert bare på påskeferie ;-]

/nute
Avatar billede mik789 Nybegynder
11. april 2004 - 13:51 #13
ok, vi gir ham noget tid...
Avatar billede atoft Nybegynder
11. april 2004 - 20:02 #14
thx fordi i ventede. Der er trods alt også andet i livet end experten :-) Fx. Kylleryller !!
Avatar billede mik789 Nybegynder
11. april 2004 - 20:17 #15
OOOkay... så er der jo en fornuftig forklaring ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester