Note that there are some explanatory texts on larger screens.

plurals
  1. POUsing XSLT to wrap elements, but it is not including the last matching element
    primarykey
    data
    text
    <p>I'm trying to transform old XML files into a new and improved structure. Part of this needs me to wrap some loose elements into a parent container, as well as modify their children</p> <p><strong>Old structure</strong></p> <pre><code>&lt;monograph&gt; &lt;title&gt;asdf&lt;/title&gt; &lt;dosage.sec id="dosage.sec.1"&gt; &lt;dosage.sec&gt;asgfd&lt;/dosage.sec&gt; &lt;dosage.sec&gt;asgfd&lt;/dosage.sec&gt; &lt;/dosage.sec&gt; &lt;dosage.sec id="dosage.sec.2"&gt; &lt;dosage.sec&gt;asgfd&lt;/dosage.sec&gt; &lt;dosage.sec&gt;asgfd&lt;/dosage.sec&gt; &lt;/dosage.sec&gt; &lt;dosage.sec id="dosage.sec.3"&gt; &lt;dosage.sec&gt;asgfd&lt;/dosage.sec&gt; &lt;dosage.sec&gt;asgfd&lt;/dosage.sec&gt; &lt;/dosage.sec&gt; &lt;products&gt; &lt;prod&gt;sadf&lt;/prod&gt; &lt;prod&gt;sadf&lt;/prod&gt; &lt;/products&gt; &lt;/monograph&gt; </code></pre> <p><strong>New structure</strong></p> <pre><code>&lt;monograph&gt; &lt;title&gt;asdf&lt;/title&gt; &lt;dosage&gt; &lt;dosage.sec id="dosage.sec.1"&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;/dosage.sec&gt; &lt;dosage.sec id="dosage.sec.2"&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;/dosage.sec&gt; &lt;dosage.sec id="dosage.sec.3"&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;/dosage.sec&gt; &lt;/dosage&gt; &lt;products&gt; &lt;prod&gt;sadf&lt;/prod&gt; &lt;prod&gt;sadf&lt;/prod&gt; &lt;/products&gt; &lt;/monograph&gt; </code></pre> <p>I found this <a href="https://stackoverflow.com/questions/3962161/how-can-i-wrap-a-group-of-adjacent-elements-using-xslt">answer</a> and modified it a bit to suit my needs:</p> <pre><code>&lt;!-- wrap dosage.sec elements in a dosage container --&gt; &lt;xsl:template match="node()|@*" name="dosage.sec"&gt; &lt;xsl:copy&gt; &lt;xsl:apply-templates select="node()|@*" /&gt; &lt;/xsl:copy&gt; &lt;/xsl:template&gt; &lt;xsl:template match="monograph/dosage.sec[not(preceding-sibling::*[1][self::dosage.sec])]"&gt; &lt;dosage&gt; &lt;xsl:call-template name="dosage.sec" /&gt; &lt;xsl:apply-templates mode="copy" select="following-sibling::*[1][self::dosage.sec]" /&gt; &lt;/dosage&gt; &lt;/xsl:template&gt; &lt;xsl:template match="monograph/dosage.sec" mode="copy"&gt; &lt;xsl:call-template name="dosage.sec"/&gt; &lt;/xsl:template&gt; &lt;!-- rename children dosage.sec --&gt; &lt;xsl:template match="dosage.sec/dosage.sec"&gt; &lt;dosage.qual&gt; &lt;xsl:apply-templates /&gt; &lt;/dosage.qual&gt; &lt;/xsl:template&gt; </code></pre> <p>But my output is:</p> <pre><code>&lt;monograph&gt; &lt;title&gt;asdf&lt;/title&gt; &lt;dosage&gt; &lt;dosage.sec id="dosage.sec.1"&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;/dosage.sec&gt; &lt;dosage.sec id="dosage.sec.2"&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;/dosage.sec&gt; &lt;dosage.sec id="dosage.sec.3"&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;/dosage.sec&gt; &lt;/dosage&gt; &lt;dosage.sec id="dosage.sec.3"&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;dosage.qual&gt;asgfd&lt;/dosage.qual&gt; &lt;/dosage.sec&gt; &lt;products&gt; &lt;prod&gt;sadf&lt;/prod&gt; &lt;prod&gt;sadf&lt;/prod&gt; &lt;/products&gt; &lt;/monograph&gt; </code></pre> <p>I'm using PHP5's built-in XSLTProcessor object - all XML and XSL are version 1.0</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload