2016-06-29 24 views
0

Ich versuche, Daten aus einer XML-Datei zu ziehen, die in der XSLT definiert:XSLT 2.0 Blatt-uri nicht immer die richtigen Daten

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xpath-default-namespace="example.com"> 

    <xsl:output method="xml" indent="yes"/> 
    <xsl:param name="sheet-uri" select="'path/to/some.xml'"/> 
    <xsl:param name="sheet-doc" select="document($sheet-uri)"/> 

    <!-- Template here --> 
    ... 
    <xsl:for-each select="IsValid/time"> 
    <Debug> 
     <xsl:variable name="referenced-code" select="$sheet-doc//Sheet/SomeData[time = current()]/id"/> 
     <xsl:choose> 
      <xsl:when test="$referenced-code"> 
       <xsl:value-of select="$referenced-code"/> 
      </xsl:when> 
      <xsl:otherwise>-1</xsl:otherwise> 
     </xsl:choose> 
    </Debug> 
    ... 

Quelle xml:

<Data xmlns="example.com"> 
    <id>21</id> 
    <IsValid> 
     <time>125622</time> 
     <time>094522</time> 
     <time>123456</time> 
    </IsValid> 
</Data> 

Die XML (some.xml) sieht wie folgt aus:

<Sheet> 
    <SomeData> 
     <time>125622</time> 
     <id>1</id> 
    <SomeData> 
    <SomeData> 
     <time>094522</time> 
     <id>1</id> 
    <SomeData> 
    <SomeData> 
     <time>123456</time> 
     <id>0</id> 
    <SomeData> 
</Sheet> 

diese endet immer Druck -1 für <Debug>. Warum funktioniert es nicht richtig? Dies funktioniert gut mit XSLT 1.0. Ich versuche, auf 2.0 zu aktualisieren, damit ich mehr Funktionen verwenden kann.

Jede Hilfe wäre willkommen, danke im Voraus!

Antwort

1

Wenn ein XML-Dokument Elemente in einem Namespace hat, aber das andere nicht, dann können Sie xpath-default-namespace nicht überall verwenden, müssen aber <xsl:variable name="referenced-code" xpath-default-namespace="" select="$sheet-doc//Sheet/SomeData[time = current()]/id"/> verwenden.

+0

Danke! Ich kann nicht glauben, dass ich das verpasst habe. – syy

1

Wenn Sie an:

xpath-default-namespace="example.com" 

dies wendet alle Ihre XPath-Ausdrücke. Da die some.xml Datei, Ihre Variable nicht diesen Namespace verwenden:

<xsl:variable name="referenced-code" select="$sheet-doc//Sheet/SomeData[time = current()]/id"/> 

endet leer.

+0

Danke auch, ich schätze es! – syy

+1

P.S. Sie sollten prüfen, ob Sie einen [key] (https://www.w3.org/TR/xslt20/#key) verwenden, um Querverweise aufzulösen. –

+0

Würde es ungefähr so ​​aussehen: ''? Obwohl ich nicht sicher bin, wie ich die '