2017-02-06 3 views
1

I Sie möchten den Link erstellen, indem Sie den Ordnernamen zusammen mit dem Dateinamen mit dem Hypen-Symbol verwenden. Wenn mein Ordnername Artikel/item.xsl mit,Sie müssen den Dateinamen erstellen, indem Sie den Ordnernamen und den Titel mithilfe von XSLT verwenden

Mein Eingang XML ist:

<Settings> 
<code>MGT</code> 
<url>http://tneb.com</url> 
</Settings> 
<page/> 
<counter> 
<enabled>true</enabled> 
<text>Management Plan</text> 
</counter> 

XSL ich als (item.xsl) verwenden im Ordnernamen (/ Titel):

<xsl:stylesheet version="3.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:json="http://json.org/" xmlns:mf="http://example.com/mf" exclude-result-prefixes="#all"> 

<xsl:template match="Settings"> 
"Settings": { 
<xsl:apply-templates/> 
}, 
</xsl:template> 

<xsl:template match="code"> 
"code": "<xsl:apply-templates/>", 
</xsl:template> 

<xsl:template match="url"> 
"url": "<xsl:apply-templates/>", 
</xsl:template> 

<xsl:template match="page"/> 

<xsl:template match="counter"> 
"counter": { 
<xsl:apply-templates/> 
}, 
</xsl:template> 

<xsl:template match="enabled"> 
"enabled": "<xsl:apply-templates/>", 
</xsl:template> 

<xsl:template match="text"> 
"text": "<xsl:apply-templates/>" , 
</xsl:template> 

</xsl:stylesheet> 

Json Output ich habe wie:

"Settings": { 

"code": "MGT", 

"url": "http://tneb.com", 

}, 

"counter": { 

"enabled": "true", 

"text": "Management Plan ", 

}, 

Aber ich brauche zwischen den Einstellungen und Zähler Ordner wie wie unten ein pDF-Link zu erstellen:

"Settings": { 

"code": "MGT", 

"url": "http://tneb.com", 

}, 
pdf: 'files/items-Management-Plan.pdf', 

"counter": { 

"enabled": "true", 

"text": "Management Plan ", 

}, 

Ich brauche den PDF-Link, dass Elemente erstellen Ordnernamen an und -Management-Plan bezeichnet die Textnamen aus der Eingabedatei. Dazwischen füllt sich der Platz des Textnamens mit dem Hypensymbol in der Ausgabe.

Bitte geben Sie einen Vorschlag dazu. Danke im Voraus.

+0

Ihre Das erste Snippet hat ein nicht passendes '', also ist es kein XML. Diese zweite "JSON" -Ausgabe hat einen nicht angegebenen "pdf" -Eigenschaftsnamen, also ist es nicht JSON. Wie beim Erstellen von JSON haben Sie "version =" 3.0 "' in Ihrem Stylesheet verwendet. Wenn Sie diese Version wirklich verwenden, gibt es bessere Möglichkeiten, JSON zu erstellen, da XSLT/XPath 3.0/3.1 Maps und Arrays haben und diese als JSON serialisieren können . –

+0

Jetzt habe ich @MartinHonnen bearbeitet. Ist dies möglich, indem XSLT für die normale Konvertierung verwendet wird, abgesehen von der json-Ausgabe? – User501

+1

Betrachten Sie das übergeordnete Element, das die Elemente 'Settings' und' counter' enthält. Dafür könnte man eine Vorlage schreiben, die z.B. '," pdf ":" Dateien/Objekte-Management-Plan.pdf ", '. –

Antwort

1

Holen Sie sich das URI des Stylesheets als Variable:

<xsl:variable name="stylesheet-uri" as="xs:string" select="base-uri(document(''))"/> 

Wert ist z /path/to/items/items.xsl

gespalten Dann ist dieser in Pfadkomponenten:

<xsl:variable name="uri-components" as="xs:string+" select="tokenize($stylesheet-uri,'/')"> 

Wert ist z ("Pfad", "auf", "Artikel", "items.xsl")

Der Ordnername ist die zweite letzte Komponente:

<xsl:variable name="folder" as="xs:string" select="$uri-components[count($uri-components) - 1]"/> 

Der zweite Teil des PDF-Namen ist der Wert von das Textelement mit den Leerzeichen durch Bindestriche ersetzt:

<xsl:variable name="PDF-name-part" as="xs:string" select="translate(//text/text(), ' ', '-')"/> 

schließlich die Bits am Ende Ihrer Einstellungen Vorlage zusammen:

<xsl:template match="Settings"> 
    "Settings": { 
    <xsl:apply-templates/> 
    }, 

    "pdf:" "<xsl:value-of select="concat('files/',$folder,'-',$PDF-name-part,'.pdf')"/>" 

</xsl:template> 
+0

Danke @Mark Dunn. Es funktioniert gut – User501

0

Sie sollten einen Root-Template hinzu:

<xsl:template match="/"> 
    <xsl:variable name="filename" select="replace(counter/text, ' ', '-')" /> 

    <xsl:apply-templates select="Settings" /> 

    <!-- The new PDF line --> 
    <xsl:text>"pdf": </xsl:text> 
    <xsl:value-of select="concat('&quot;', 'files/items-', $filename, '.pdf', '&quot;', ',&#xA;')" />  

    <xsl:apply-templates select="Counter" /> 
</xsl:template> 

Dadurch wird die gewünschte Zeile zwischen Einstellungen und Zählerausgänge.

+0

Danke @SomeStupid. – User501

Verwandte Themen