2016-05-25 3 views
1

Ich versuche, bestimmte div-Tags mit Skript-Tags innerhalb einer Ebene zu ersetzen. Der Code innerhalb der div, die gesetzt ist, um keine anzuzeigen, ist was ich brauche (verwerfe die zwei äußeren divs), und die divs in diesem Code, der eine Klasse von "is-script" hat, müssen durch Skript ersetzt werden, während seine Attribute beibehalten werden und Knoten. Einige Beispiele dafür, wie der Code aussehen:XSLT: Ersetzen div mit Skript auf mehreren Ebenen

<div data-type="embed"> 
    <div style="display:none;"> 
     <div class="is-script" src="http://example.js"></div> 
    </div> 
</div> 

<div data-type="embed"> 
    <div style="display:none;"> 
     <div class="is-script" src="http://example1.js"></div> 
     <div class="is-script" src="http://example2.js"></div> 
    </div> 
</div> 

<div data-type="embed"> 
    <div style="display:none;"> 
     <div> 
      <div class="is-script" src="http://example.js"></div> 
     </div> 
    </div> 
</div> 

<div data-type="embed"> 
    <div style="display:none;"> 
     <div> 
      <div class="is-script" src="http://example1.js"></div> 
      <div class="is-script" src="http://example2.js"></div> 
     </div> 
    </div> 
</div> 

<div data-type="embed"> 
    <div style="display:none;"> 
     <div> 
      <div class="is-script" src="http://example1.js"></div> 
      <div class="is-script">some inline javascript</div> 
     </div> 
    </div> 
</div> 

<div data-type="embed"> 
    <div style="display:none;"> 
     <iframe src="http://example.html" width="100%" height="400px"></iframe> 
    </div> 
</div> 

Die eigentliche json, dass die xsl wird Parsen:

<div data-type=\"embed\" style=\"width:545px;height:200px;background-color:#ccc;\">HTML EMBED 
    <div style=\"display:none;\"> 
     <div class=\"is-script\">console.log(\"test1\");</div> 
    </div> 
</div> 

<div data-type=\"embed\" style=\"width:545px;height:200px;background-color:#ccc;\">HTML EMBED 
    <div style=\"display:none;\"> 
     <div> 
      <div class=\"is-script\">console.log(\"test2\");</div> 
     </div> 
    </div> 
</div> 

<div data-type=\"embed\" style=\"width:545px;height:200px;background-color:#ccc;\">HTML EMBED 
    <div style=\"display:none;\"> 
     <div class=\"is-script\" src=\"example.js\"></div> 
    </div> 
</div> 

<div data-type=\"embed\" style=\"width:545px;height:200px;background-color:#ccc;\">HTML EMBED 
    <div style=\"display:none;\"> 
     <div> 
      <div class=\"is-script\" src=\"example.js\"></div> 
     </div> 
    </div> 
</div> 

<div data-type=\"embed\" style=\"width:545px;height:200px;background-color:#ccc;\">HTML EMBED 
    <div style=\"display:none;\"> 
     <div> 
      <div class=\"is-script\" src=\"example1.js\"></div> 
      <div class=\"is-script\" src=\"example2.js\"></div> 
      <div class=\"is-script\" src=\"example3.js\"></div> 
     </div> 
    </div> 
</div> 

Gewünschtes Ergebnis:

<script class="is-script" src="http://example.js"></script> 


<script class="is-script" src="http://example1.js"></script> 
<script class="is-script" src="http://example2.js"></script> 


<div> 
    <script class="is-script" src="http://example.js"></script> 
</div> 


<div> 
    <script class="is-script" src="http://example1.js"></script> 
    <script class="is-script" src="http://example2.js"></script> 
</div> 


<div> 
    <script class="is-script" src="http://example1.js"></script> 
    <script class="is-script">some inline javascript</script> 
</div> 


<iframe src="http://example.html" width="100%" height="400px"></iframe> 

Aktuelles Ergebnis:

<script class="was-script-tag">console.log("test1");</script> 

<div> 
    <div class="was-script-tag">console.log("test2");</div> 
</div> 

<script class="was-script-tag" src="/templates/v1/js/sticky_article_v7.js?v0"></script> 

<div> 
    <div class="was-script-tag" src="/templates/v1/js/sticky_article_v7.js?v1"></div> 
</div> 

<div> 
    <div class="was-script-tag" src="/templates/v1/js/sticky_article_v7.js?v2"></div> 
    <div class="was-script-tag" src="/templates/v1/js/sticky_article_v7.js?v2"></div> 
    <div class="was-script-tag" src="/templates/v1/js/sticky_article_v7.js?v2"></div> 
</div> 

Mein xsl:

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:output method="html" indent="yes"/> 


    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="div[@data-type='embed' or parent::div[@data-type='embed']]"> 
     <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="div[@class='is-script']"> 
     <script> 
      <xsl:apply-templates select="@*|node()"/> 
     </script> 
    </xsl:template> 

</xsl:stylesheet> 

Also im Grunde zwei äußere divs zu entfernen, und das Every halten innen wie es ist, mit Ausnahme divs mit Klasse „ist-Skript“, das Skript umbenannt werden müssen. Die zwei äußeren Divs werden immer gleich sein.

Ich habe ein grundlegendes Verständnis von xsl, aber das ist etwas, was ich einfach nicht arbeiten kann. Mit Xslt 2.

Antwort

0

Sie möglicherweise mit der Identity-Vorlage beginnen könnte, die alle vorhandenen Knoten ohne Änderung kopiert

<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

Dann die „äußeren beiden divs“ zu ignorieren, können Sie eine übergeordnete Vorlage hinzufügen so wie:

<xsl:template match="div[@data-type='embed' or parent::div[@data-type='embed']]"> 
    <xsl:apply-templates /> 
</xsl:template> 

Dies ignoriert div Elemente mit einem Datentyp einbetten, oder seinem unmittelbaren Kind div.

dann die "is-Skript" divs script Elemente ändern, die Sie

<xsl:template match="div[@class='is-script']"> 
    <script> 
    <xsl:apply-templates select="@*|node()"/> 
    </script> 
</xsl:template> 

Versuchen Sie, diese XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="div[@data-type='embed' or parent::div[@data-type='embed']]"> 
    <xsl:apply-templates /> 
    </xsl:template> 

    <xsl:template match="div[@class='is-script']"> 
    <script> 
     <xsl:apply-templates select="@*|node()"/> 
    </script> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Sie für die Beantwortung von Vielen eine andere Vorlage hinzufügen können. Das ist ziemlich genau das, was ich auch getan habe, aber es ersetzt nur das div auf der obersten Ebene. Das bedeutet, dass alle Divs mit der Klasse "is-script" in einem div nicht transformiert werden. Wenn Sie positiv sind, sollte dieser Code funktionieren, dann denke ich, muss ich auf andere Faktoren schauen. – Shaidar

+0

Das XSLT sollte die erwartete Ausgabe erzeugen, die Sie in Ihrer Frage haben (nachdem Sie Ihrem XML ein einzelnes Wurzelelement hinzugefügt haben). Können Sie Ihre Frage vielleicht bearbeiten, um eine Beispiel-XML anzuzeigen, in der sie nicht die korrekte Ausgabe liefert? Vielen Dank. –

+0

Ich habe den Beitrag mit weiteren Details aktualisiert. Wenn es relevant ist: Ich benutze Saxon Parser. Seite wird mit jstl gemacht. Es gibt einige kleinere Unterschiede zwischen dem ursprünglichen vereinfachten Code und dem tatsächlichen JSON. Ich kann den Beitrag so bearbeiten, dass er genau derselbe ist, wenn unklar ist, wonach ich frage. – Shaidar