2017-02-14 7 views
0

Ich habe eine XML-Datei wie die unten. Der Kürze halber liste ich es nicht vollständig auf.Umgang mit Namespaces und Variablen in XSLT

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<OBJECTS xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
     xmlns="http://www.example.com/" 
     xsi:schemaLocation=".\\intermediate\\example.xsd"> 
    <OBJECT> 
     <abbreviation>ABCD</abbreviation> 
     <LINKS> 
     .... 

Und ich möchte einige Teile davon in meinem XSLT beziehen.

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" 
    xmlns:t="http://www.example.com/" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=".\\intermediate\\example.xsd"> 

<xsl:output method="xml" indent="yes" encoding="utf-8"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="objs" select ="t:OBJECTS/OBJECT"/> 
<xsl:variable name="cnt" select="count($objs)"/> 

<xsl:template match="t:*"> 
Count of objects is <xsl:value-of select="$cnt" /> 
</xsl:template> 

</xsl:stylesheet> 

Meine Absicht ist, die Anzahl aller Objekte nach diesem Namespace anzuzeigen. Das konnte ich nicht erreichen.

Count of objects is 100. 

Wenn ich Namespace in der XML-Datei entferne, bekomme ich es. Wo wäre das Problem?

Antwort

1

nicht 100% sicher, was Sie erreichen wollen, aber ich habe bemerkt, Sie nicht den t: Präfix in Ihrem Kind Selektor, so dass ich darauf hindeutet, verwenden

<xsl:variable name="objs" select ="t:OBJECTS/t:OBJECT"/> 

statt

<xsl:variable name="objs" select ="t:OBJECTS/OBJECT"/> 
+1

Das ist richtig. Ein Standard-Namespace (ohne Präfix) wird vererbt, daher befindet sich 'OBJECT' im selben Namespace wie seine übergeordneten' OBJECTS'. –

+0

Es hat perfekt funktioniert. Mein Ziel ist es, mehrere XML-Dokumente aus mehreren Namespaces mit einem einzigen xslt zu verarbeiten. Ich war bisher teilweise erfolgreich und danke einer Million dafür, dass ich in sehr kurzer Zeit den genauen Zeiger gegeben habe. –