2017-12-31 15 views
1

ich versucht bin, ein Dokument zu aktualisieren, die wie folgt aussieht:XSL ein Attribut mit der Position des umschließenden Elements Aktualisierung

<document n="foo"> 
    <body> 
     <seg xml:id="xkj">some text</seg> 
     <seg xml:id="njk">some text</seg> 
     <seg xml:id="ine">some text</seg> 
     <seg xml:id="ocu">some text</seg> 
    </body> 
</document> 

Damit jeder seg/@xml:id mit einer Verkettung des document/@n aktualisiert wird und die seg/()position in der Dokument.

Das Ergebnis wäre dann:

<document n="foo"> 
    <body> 
     <seg xml:id="foo-1">some text</seg> 
     <seg xml:id="foo-2">some text</seg> 
     <seg xml:id="foo-3">some text</seg> 
     <seg xml:id="foo-4">some text</seg> 
    </body> 
</document> 

Der Code ich versuche:

<xsl:variable name="var_val" select="tei:document/[email protected]"/> 

<xsl:template match="tei:seg/@xml:id"> 
     <xsl:value-of select="'$var_val' || '-' || parent::node()/position()"/> 
</xsl:template> 

Aber es ist die folgende Ausdrehen, die gleiche position() = 1 wiederholen:

<document n="foo"> 
    <body> 
     <seg xml:id="foo-1">some text</seg> 
     <seg xml:id="foo-1">some text</seg> 
     <seg xml:id="foo-1">some text</seg> 
     <seg xml:id="foo-1">some text</seg> 
    </body> 
</document> 

Ich verstehe entweder nicht position() oder nicht durch die XP ATH-Achse korrekt.

Vielen Dank im Voraus.

+0

position() gibt die Position des Kontextelements in der Reihenfolge der Knoten zurück, die gerade verarbeitet werden. In Ihrem Fall ist diese Sequenz 'parent :: node()', die nur einen Knoten enthält, also ist position() immer 1. –

Antwort

2

position() für die im Zusammenhang mit der Schablone übereinstimmen das Attribut nicht das richtige Werkzeug ist, entweder Sie count(../(., preceding-sibling::seg)) müssen oder können Sie xsl:number verwenden:

<xsl:template match="seg/@xml:id"> 
     <xsl:variable name="pos" as="xs:integer"> 
      <xsl:number count="seg"/> 
     </xsl:variable> 
     <xsl:attribute name="{name()}" namespace="{namespace-uri()}" select="$var_val, $pos" separator="-"/> 
    </xsl:template> 

http://xsltfiddle.liberty-development.net/pPgCcok

1

position() nur funktioniert auf Knotengruppen. Mit dem Ausdruck

<xsl:template match="tei:seg/@xml:id"> 

Sie Zurücksetzen position() einer bei jedem Spiel dieser Vorlage.

besser So ein <xsl:for-each...> verwenden, die die erwartete Erhöhung der Anzahl tut:

<xsl:variable name="var_val" select="/tei:document/@n"/> 

<xsl:template match="tei:body"> 
    <xsl:for-each select="tei:seg"> 
    <seg xml:id="{concat($var_val, '-', position())}"> 
     <xsl:copy-of select="node()" /> 
    </seg> 
    </xsl:for-each> 
</xsl:template> 

Sein Ausgang ist:

<seg xml:id="foo-1">some text</seg> 
<seg xml:id="foo-2">some text</seg> 
<seg xml:id="foo-3">some text</seg> 
<seg xml:id="foo-4">some text</seg> 
+0

Ah, ja, ich habe nicht bemerkt, dass die Position bei jeder Übereinstimmung auf '1' zurückgesetzt wurde - Ich dachte, die Position sei statisch zum Originaldokument. Macht Sinn. Danke für die Klärung und die Alternative. – idjet

0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:tei="http://tei"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:variable name="var_val" select="/tei:document/@n"/> 
<xsl:template match="tei:document"> 
    <xsl:copy><xsl:copy-of select="@n"/><xsl:apply-templates/></xsl:copy> 
</xsl:template> 
<xsl:template match="tei:body"> 
    <xsl:copy><xsl:apply-templates/></xsl:copy> 
</xsl:template> 
<xsl:template match="tei:seg"> 
<xsl:copy><xsl:attribute name="xml:id"><xsl:value-of select="concat(concat($var_val,'-'),position())"/></xsl:attribute><xsl:value-of select="text()"/></xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 

Der obige Code generiert die gewünschte Ausgangsleerraum bieten wurden von der Eingabe entfernt:

<?xml version="1.0" encoding="UTF-8"?><document n="foo" xmlns="http://tei"><body><seg xml:id="xkj">some text</seg><seg xml:id="njk">some text</seg><seg xml:id="ine">some text</seg><seg xml:id="ocu">some text</seg></body></document> 
Verwandte Themen