2016-05-11 6 views
0

Kann nicht meine tatsächlichen Anwendungsfall zu arbeiten. Mein Code ist derzeitBenötigen Sie eine XSL-Lösung zu implementieren, aber ein Problem

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template name="bundle-main"> 
    <div 
     class="container" 
     data-page-type="bundle" 
     > 
     <div class="row"> 
     <xsl:for-each select="//bundles-entry-by-bundle/entry/components/item"> 
      <xsl:variable name="id" select="@id" /> 
      <xsl:if test="@section-handle = 'components-text'"> 
      <xsl:for-each select="//*[concat(@section-handle,'-entry-by-bundle')]/entry[@id = $id]"> 
       <xsl:call-template name="components-text"/> 
      </xsl:for-each> 
      </xsl:if> 
      <xsl:if test="@section-handle = 'components-link'"> 
      <xsl:for-each select="//*[concat(@section-handle,'-entry-by-bundle')]/entry[@id = $id]"> 
       <xsl:call-template name="components-link"/> 
      </xsl:for-each> 
      </xsl:if> 
     </xsl:for-each> 
     </div> 
    </div> 
    </xsl:template> 
</xsl:stylesheet> 

Das druckt eine Zeile, aber es muss die 12-Spalten-Wrapper implementieren. Mein Versuch lohnt sich nicht, da es nicht ganz funktioniert. Ich glaube, dass der Schlüsselwähler so etwas wie

sum(*[name() = concat($stack-items/@section-handle, '-entry-by-bundle')]/entry[@id = //bundles-entry-by-bundle/entry/components/item/@id]/columns/item/@handle) >= 12 or $i >= count($items) 

Hier ist der XML

<?xml version="1.0" encoding="utf-8" ?> 
<data> 
    <bundles-entry-by-bundle> 
    <section id="1" handle="bundles">Bundles</section> 
    <entry id="3"> 
     <components> 
     <item id="10" handle="perfect-fit-finder-4-columns" section-handle="components-link" section-name="Components: Link">Perfect fit finder (4 columns)</item> 
     <item id="13" handle="collection-morning-run-8-column" section-handle="components-link" section-name="Components: Link">Collection: Morning run (8 column)</item> 
     <item id="14" handle="collection-weekend-adventures-4-column" section-handle="components-link" section-name="Components: Link">Collection: Weekend Adventures (4 column)</item> 
     </components> 
    </entry> 
    </bundles-entry-by-bundle> 
    <fl-languages> 
    <current-language handle="en" language="en" region="">English</current-language> 
    <supported-languages> 
     <item handle="en" main="yes">English</item> 
     <item handle="fr">Français</item> 
     <item handle="es">Español</item> 
    </supported-languages> 
    </fl-languages> 
    <components-text-entry-by-bundle> 
    <section id="4" handle="components-text">Components: Text</section> 
    <error>No records found.</error> 
    </components-text-entry-by-bundle> 
    <components-link-entry-by-bundle> 
    <section id="6" handle="components-link">Components: Link</section> 
    <entry id="14"> 
     <headline-above mode="formatted" handle="collection-2" word-count="1" lang="en" handle-en="collection-2" handle-fr="" handle-es="">Collection</headline-above> 
     <headline mode="formatted" handle="weekend-adventures" word-count="2" lang="en" handle-en="weekend-adventures" handle-fr="" handle-es="">Weekend Adventures</headline> 
     <color has-color="no" /> 
     <columns> 
     <item handle="4">4</item> 
     </columns> 
     <square-image size="23.28 MB" bytes="24413135" path="/uploads/components-link" type="image/jpeg"> 
     <filename>weekend-collection-en-1462960850.jpg</filename> 
     <meta creation="2016-05-11T02:00:51-08:00" width="4656" height="4656" /> 
     </square-image> 
     <click-hint>No</click-hint> 
     <style> 
     <item handle="modern">Modern</item> 
     </style> 
    </entry> 
    <entry id="13"> 
     <headline-above mode="formatted" handle="collection" word-count="1" lang="en" handle-en="collection" handle-fr="" handle-es="">Collection</headline-above> 
     <headline mode="formatted" handle="morning-run" word-count="2" lang="en" handle-en="morning-run" handle-fr="" handle-es="">Morning Run</headline> 
     <color has-color="no" /> 
     <columns> 
     <item handle="8">8</item> 
     </columns> 
     <square-image size="257 KB" bytes="263474" path="/uploads/components-link" type="image/jpeg"> 
     <filename>morning-run-square-en-1462939487.jpg</filename> 
     <meta creation="2016-05-10T20:04:47-08:00" width="995" height="995" /> 
     </square-image> 
     <wide-image size="457 KB" bytes="468427" path="/uploads/components-link" type="image/jpeg"> 
     <filename>morning-run-en-1462939487.jpg</filename> 
     <meta creation="2016-05-10T20:04:47-08:00" width="2096" height="995" /> 
     </wide-image> 
     <click-hint>No</click-hint> 
     <style> 
     <item handle="modern">Modern</item> 
     </style> 
    </entry> 
    <entry id="10"> 
     <headline mode="formatted" handle="perfect-fit-finder" word-count="3" lang="en" handle-en="perfect-fit-finder" handle-fr="" handle-es="">Perfect fit finder</headline> 
     <color r="0" g="168" b="225" has-color="yes">#00a8e1</color> 
     <columns> 
     <item handle="4">4</item> 
     </columns> 
     <icon size="2 KB" bytes="2102" path="/uploads/components-link" type="image/svg+xml"> 
     <filename>shoe-icon-en-1462909181.svg</filename> 
     <meta creation="2016-05-10T11:39:41-08:00" width="100" height="41.7" /> 
     </icon> 
     <click-hint>Yes</click-hint> 
     <style> 
     <item handle="bold">Bold</item> 
     </style> 
    </entry> 
    </components-link-entry-by-bundle> 
</data> 

Hier ist die solution würde ich mit dem obigen XML implementieren möchten und meine XSL zu ersetzen. Dieser Code

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="/root"> 
    <xsl:copy> 
     <xsl:call-template name="aggregate"> 
      <xsl:with-param name="items" select="item"/> 
     </xsl:call-template> 
    </xsl:copy> 
</xsl:template> 

<xsl:template name="aggregate"> 
    <xsl:param name="items" select="/.."/> 
    <xsl:param name="i" select="1"/> 
    <xsl:variable name="stack-items" select="$items[position() &lt;= $i]" /> 
    <xsl:choose> 
     <xsl:when test="sum($stack-items/@columns) >= 12 or $i >= count($items)"> 
      <row> 
       <xsl:copy-of select="$stack-items"/> 
      </row> 
      <xsl:if test="$i &lt; count($items)"> 
       <xsl:call-template name="aggregate"> 
        <xsl:with-param name="items" select="$items[position() > $i]"/> 
       </xsl:call-template> 
      </xsl:if> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:call-template name="aggregate"> 
       <xsl:with-param name="items" select="$items"/> 
       <xsl:with-param name="i" select="$i + 1"/> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

</xsl:stylesheet> 
+2

Ich verstehe nicht, was Sie versuchen, hier zu tun. Bitte (1) posten Sie das erwartete Ergebnis und (2) erklären Sie die Logik, die angewendet werden muss, um sie zu erhalten. Das Entfernen der Teile, die dabei keine Rolle spielen, wäre ebenfalls hilfreich. --- Sie sagen, dass Ihre aktuelle XSLT "eine Zeile druckt", aber das stimmt einfach nicht. Tatsächlich tut es nichts, weil Ihre oberste Schablone nie aufgerufen wird, und die eingebauten Standardschablonen treten ein, um alle Textknoten im Quell-XML auszugeben –

+0

Sie sind völlig richtig, mein schlechtes, mein Ziel nicht klarer zu machen. Ich habe es aktualisiert, um klarer zu sein. –

+0

Sie erhalten viel eher eine Antwort, wenn Sie Ihre erwartete Ausgabe posten, wie @ michael.hor257k vorgeschlagen. –

Antwort

3

ist offensichtlich falsch:

//*[concat(@section-handle,'-entry-by-bundle')] 

, weil, wenn Sie eine Zeichenfolge in einem Prädikat verwenden, der Effektivwert ist wahr, wenn die Zeichenfolge nicht leer ist, und das ist immer der Fall, hier .

Ich vermute, Sie versuchen, Elemente auszuwählen, deren Name der Verkettung von (@ section-handle, '- entry-by-bundle') entspricht. Dies scheint ein Fall zu sein, in dem Sie Vorlagenregeln anstelle von benannten Vorlagen verwenden sollten. ("Silly xsl" hat den perfekten Mechanismus für Ihre Anforderung, und Sie ignorieren es!). Ersetzen Sie diesen Code:

 <xsl:for-each select="//bundles-entry-by-bundle/entry/components/item"> 
      <xsl:variable name="id" select="@id" /> 
      <!-- silly xsl will not let us programatically call templates --> 
      <xsl:if test="@section-handle = 'components-text'"> 
      <xsl:for-each select="//*[concat(@section-handle,'-entry-by-bundle')]/entry[@id = $id]"> 
       <xsl:call-template name="components-text"/> 
      </xsl:for-each> 
      </xsl:if> 
      <xsl:if test="@section-handle = 'components-link'"> 
      <xsl:for-each select="//*[concat(@section-handle,'-entry-by-bundle')]/entry[@id = $id]"> 
       <xsl:call-template name="components-link"/> 
      </xsl:for-each> 
      </xsl:if> 
     </xsl:for-each> 

von

<xsl:for-each select="//bundles-entry-by-bundle/entry/components/item"> 
    <xsl:apply-templates select="//*[name()=concat(current()/@section-handle, '-entry-by-bundle'/> 
</xsl:template> 

<xsl:template match="component-text-entry-by-bundle"> 
    <!-- your component-text template --> 
</xsl:template> 

<xsl:template match="component-link-entry-by-bundle"> 
    <!-- your component-link template --> 
</xsl:template> 
+0

Haha, oh Michael, das war eine lustige Lektüre - Die Implementierung jetzt versuchen! : D Danke! Ich denke immer noch an XSL Gedankenmuster –

+0

Wenn Sie einen Moment haben, um über das aktualisierte Problem zu schauen, würde es sehr geschätzt werden. –

+0

Entschuldigung, ich gehe nicht mit dieser Angelegenheit der Änderung der Frage, nachdem es beantwortet wurde. Es ist eine sehr lange Frage und Sie haben keine Hinweise gegeben, was sich geändert hat. –

Verwandte Themen