2017-03-05 2 views
0

Ich versuche Wert in xml suchen key verwenden, aber ich bin nicht erwartete Ergebnis bekommen hier ist mein Code http://xsltransform.net/6rewNyZ/1Wie verwende ich den Schlüssel in xslt?

<xsl:key name="mid" match="parent_id" use="@id"/> 
    <xsl:template match="/"> 
     <hmtl> 
    <xsl:variable name="msid" select="'54'"/> 
    <xsl:variable name="msids_map"> 
     <parent_id id="34"> 
      <childid>1</childid> 
      <childid>2</childid> 
     </parent_id> 
     <parent_id id="54"> 
      <childid>3</childid> 
      <childid>4</childid> 
     </parent_id> 
    </xsl:variable> 
     <xsl:variable name ="abc" select="ext:node-set(msids_map)"> 
     </xsl:variable> 
     <xsl:variable name="getValue" select= 
     "key('mid', $abc)"/> 

     <xsl:value-of select="$getValue"/> 

Erwartete Ausgabe

<parent_id id="54"> 
       <childid>3</childid> 
       <childid>4</childid> 
      </parent_id> 

Antwort

0

Sie haben ein paar kleineren Syntax Probleme und ein großes Kontext Problem. Keys arbeitet im Kontext des aktuellen Dokuments - in Ihrem Beispiel ist dies das XML-Eingabedokument. Damit der Schlüssel für die Variable (die ein eigenes Dokument ist) verwendet wird, müssen Sie zunächst den Kontext wechseln, z. B. indem Sie vor dem Aufrufen des Schlüssels xsl:for-each select="$abc" verwenden. Hier

ist ein vollständiges Beispiel (mit den Syntaxfehler korrigiert, auch):

XSLT 1,0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:ext="http://exslt.org/common" 
extension-element-prefixes="ext"> 
<xsl:output method="html" encoding="UTF-8"/> 

<xsl:key name="mid" match="parent_id" use="@id"/> 

<xsl:template match="/"> 
    <hmtl> 
     <xsl:variable name="msid" select="'54'"/> 
     <xsl:variable name="msids_map"> 
      <parent_id id="34"> 
       <childid>1</childid> 
       <childid>2</childid> 
      </parent_id> 
      <parent_id id="54"> 
       <childid>3</childid> 
       <childid>4</childid> 
      </parent_id> 
     </xsl:variable> 
     <xsl:variable name ="abc" select="ext:node-set($msids_map)"/> 
     <xsl:for-each select="$abc"> 
      <xsl:variable name="getValue" select="key('mid', $msid)"/> 
      <xsl:copy-of select="$getValue"/> 
     </xsl:for-each> 
     </hmtl> 
</xsl:template> 

</xsl:stylesheet> 

Demo: http://xsltransform.net/6rewNyZ/4

0

du so bearbeitet versuchen können, in deinem Code.

<?xml version="1.0" encoding="UTF-8" ?> 
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:ext="http://exslt.org/common"> 

     <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 
     <xsl:key name="mid" match="parent_id" use="@id"/> 
     <xsl:template match="/"> 
      <hmtl> 
     <xsl:variable name="msid" select="'54'"/> 
     <xsl:variable name="msids_map"> 
      <parent_id id="34"> 
       <childid>1</childid> 
       <childid>2</childid> 
      </parent_id> 
      <parent_id id="54"> 
       <childid>3</childid> 
       <childid>4</childid> 
      </parent_id> 
     </xsl:variable> 
      <xsl:variable name ="abc" select="$msids_map" as="node()"> 
      </xsl:variable> 
      <xsl:copy-of select="$abc/key('mid', $msid)"/> 
      </hmtl> 
     </xsl:template> 
    </xsl:transform> 

Ausgang

<parent_id id="54"> 
     <childid>3</childid> 
     <childid>4</childid> 
    </parent_id> 
+0

Ihre Lösung erfordert XSLT 2.0 Die Frage ist markiert XSLT 1.0. –

+0

eigentlich habe ich diesen Code nicht in meinem Editor ausgeführt, nur an der Stelle in Frage gestellt, so dass passiert, danke für Ihr Feedback. – Rupesh

0

Die Schlüsselfunktion in 1.0 Arbeiten auf dem Kontextknoten. Um also einen Schlüssel für eine Variable zu verwenden, müssen Sie ihn irgendwie als Kontextknoten verwenden. Ein anderer Ansatz, der für 1.0 geeignet ist, wäre, keine Schlüssel zu verwenden. Verwenden Sie einfach die Variable und filtern Sie nach Ihren Wünschen. Gibt es einen dringenden Grund, Schlüssel zu benutzen? Suchst du nach Einzigartigkeit? Das kann auch mit einem Filter gemacht werden.

<!-- Add $ before variable to fix bug. --> 
    <xsl:variable name ="abc" select="msxsl:node-set($msids_map)"> 

    ..... 

    <xsl:variable name="getValue"> 
    <xsl:copy-of select="$abc/parent_id[@id=$msid]"/> 
    </xsl:variable> 
Verwandte Themen