2016-03-24 3 views
0

Ich habe eine XSLT-Vorlage, die QNames, ähnlich wie dies erfordert sind Datenweitergabe in Top-Level-Parameter, deren Namen durch einEinstellung QName Parameter in xsltproc

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:eg="http://example.com/" version="1.0"> 
    <xsl:param name="eg:foo"/> 
    <xsl:output method="text"/> 
    <xsl:template match="/"> 
    <xsl:value-of select="$eg:foo"/> 
    </xsl:template> 
</xsl:stylesheet> 

Ich kann nicht umbenannt werden die Parameter wie ihre definiert externen Standard, und ich muss in der Lage sein, mit Vorlagen von Drittanbietern zu arbeiten, die diesem Standard entsprechen. Ich würde bevorzugen, xsltproc zu verwenden, um Schablone zu verarbeiten, da ich es bereits im Projekt verwende und ich kenne seine Eigenheiten. Aber ich kann nicht herausfinden, wie man einen QName Parameter von der Befehlszeile einstellt. Was ich wirklich will, ist so etwas wie

xsltproc --xmlns eg http://example.com/ --stringparam eg:foo Something \ 
    template.xsl input.xml 

..., die den Wert der zB Echo zurück sollte: foo Parameter. (Der Inhalt von input.xml ist irrelevant, solange er wohlgeformt ist.) Aber ich kann nichts finden wie meine hypothetische Befehlszeilenoption --xmlns. Kann jemand vorschlagen, wie ich dies tun könnte, ohne das spezielle Präfix hart zu kodieren, das in template.xsl verwendet wurde?

+0

Kannst du nicht einfach 'verwenden --stringparam zB: foo‚Foo bar''? Scheitert das? Ich habe versucht xsltproc in einer Windows-Eingabeaufforderung mit verschiedenen Kombinationen wie '--stringparam" zB: foo "bar',' --stringparam zB: foo bar' und '--stringparam zB: foo" foo bar "' und alles hat gut funktioniert . Zugegeben, das Anführungszeichen könnte von der Kommandozeilen-Shell abhängen, aber ich denke nicht, dass Sie eine Namensraumbindung einrichten müssen. –

+0

Ja, du hast recht, ich kann. Aber woher weiß ich, welches Präfix verwendet werden soll? Die Auswahl eines Präfixes ist ein Implementierungsdetail der Vorlage, nicht Teil ihrer Schnittstelle. –

+0

Sie können also nicht die Namespace-Deklarationen im XSLT-Stylesheet betrachten? –

Antwort

1

xsltproc ist nicht in der Lage, Parameter mit vorangestellten Parameternamen anders als mit dem in der Vorlage verwendeten Präfix anzugeben. Dies ist bedauerlich, weil pro §4 des XML Namespaces specification,

Anwendungen den Namespace-Namen verwenden, sollten Sie nicht das Präfix, Namen in der Konstruktion, deren Umfang sich über das Dokument enthält.

Hier sind drei mögliche Wege zur Vermeidung einer bestimmten Präfixwahl.

1: Verwenden Sie einen anderen XSLT-Prozessor. Saxon unterstützt das Einstellen von Parametern, ohne das Präfix zu kennen. Die Syntax lautet:

java net.sf.saxon.Transform -s:input.xml -xsl:template.xsl \ 
    "{http://example.com/}foo='Something'" 

2: Patch xsltproc unterstützen. Libxslt bug 764195 umfasst einen Patch, der zum Einstellen der Parameter eine Saxon-ähnliche Syntax ergänzt:

xsltproc --stringparam {http://example.com/}:foo Something \ 
    template.xsl input.xml 

3: das Präfix nachschlagen Bindung. Eine einfache XPath-Abfrage kann das Präfix nachschlagen, die in der Vorlage verwendet wird, und dann die Parameternamen, dass die Verwendung konstruieren:

PREFIX=`xmllint --noout template.xsl --xpath \ 
      "name(/*/namespace::*[string()='http://example.com/'])"` 
xsltproc --stringparam "$PREFIX:foo" Something template.xsl input.xml