Note that there are some explanatory texts on larger screens.

plurals
  1. POXSL key to get elements that meet specific criteria
    primarykey
    data
    text
    <p>I am working with table entry elements and want to get all preceding entry elements in the same table that pass the following test:</p> <pre><code>parent::row/preceding-sibling::row/entry [@morerows &gt;= count(parent::row/following-sibling::row [not(preceding-sibling::row/entry [generate-id() = $id])])] [count(preceding-sibling::entry [not(@morerows)]) + 1 = count(current()/preceding-sibling::entry) + 1] </code></pre> <p>The XPath gives me the desired result, but it is painfully slow..... I would like to use a key but am having problems.</p> <p>I defined a key as follows:</p> <pre><code>&lt;xsl:key name="moreRowsEntry" match="entry[@morerows]" use="."/&gt; </code></pre> <p>While the key does retrieve all entry elements with the morerows attribute, I actually only need it to retrieve those within the same ancestor table. As well, I am at a loss as to how to test the morerows value. I have tried things such as :</p> <p><code>&lt;xsl:for-each select="key('moreRowsEntry', (@morerows &gt;= count(parent::row/following-sibling::row[not(preceding-sibling::row/entry[generate-id() = $id])])) and (count(preceding-sibling::entry[not(@morerows)]) + 1 = count(current()/preceding-sibling::entry) + 1))"&gt;</code></p> <p>I have to do this using XSL 1.0. Any and all help is appreciated. </p> <p>Some further information:</p> <p>I am converting a CALS table to OOXML. For each entry in the CALS table that is within a row in which I know there are cells missing, I need to add those additional cells. For these entry elements I have an <code>$id</code> that is the generate-id() value of the element.</p> <p>I then have the XPath from above, which tests that any entry elements in the preceding rows of the table (<code>parent::row/preceding-sibling::row/entry</code>) that have a morerows attribute that is greater than or equal to the number of rows between itself and the entry with the id of <code>$id</code>, and that are in the correct position in which the empty cell should be inserted (<code>count(preceding-sibling::entry[not(@morerows)]) + 1 = count(current()/preceding-sibling::entry) + 1</code>)</p> <p>Simplified Sample Input:</p> <pre><code>&lt;table&gt; &lt;tbody&gt; &lt;row&gt; &lt;entry morerows="2"&gt;A&lt;/entry&gt; &lt;entry morerows="1"&gt;B&lt;/entry&gt; &lt;entry&gt;C&lt;/entry&gt; &lt;entry&gt;D&lt;/entry&gt; &lt;/row&gt; &lt;row&gt; &lt;entry&gt;E&lt;/entry&gt; &lt;entry&gt;F&lt;/entry&gt; &lt;/row&gt; &lt;row&gt; &lt;entry&gt;G&lt;/entry&gt; &lt;entry&gt;H&lt;/entry&gt; &lt;entry&gt;I&lt;/entry&gt; &lt;/row&gt; &lt;row&gt; &lt;entry&gt;J&lt;/entry&gt; &lt;entry&gt;K&lt;/entry&gt; &lt;entry&gt;L&lt;/entry&gt; &lt;entry&gt;M&lt;/entry&gt; &lt;/row&gt; &lt;/tbody&gt; &lt;/table&gt; </code></pre> <p>Simplified Sample Output:</p> <pre><code>&lt;w:tbl&gt; &lt;w:tr&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;A&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;B&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;C&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;D&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;/w:tr&gt; &lt;w:tr&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;E&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;F&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;/w:tr&gt; &lt;w:tr&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;G&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;H&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;I&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;/w:tr&gt; &lt;w:tr&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;J&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;K&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;L&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;M&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;/w:tr&gt; &lt;/w:tbl&gt; </code></pre> <p>The input uses the morerows attribute to specify spanned rows. The output requires that actual cells be inserted with the <code>&lt;w:vMerge/&gt;</code> element for each spanned cell.</p> <p>Another sample:</p> <p>In this sample, there are also merged columns (specified by the namest and nameend attributes) that must also be taken in to account:</p> <pre><code>&lt;table&gt; &lt;tgroup cols="7"&gt; &lt;colspec colname="col1"/&gt; &lt;colspec colname="col2"/&gt; &lt;colspec colname="col3"/&gt; &lt;colspec colname="col4"/&gt; &lt;colspec colname="col5"/&gt; &lt;colspec colname="col6"/&gt; &lt;colspec colname="col7"/&gt; &lt;tbody&gt; &lt;row&gt; &lt;entry morerows="5"&gt;A&lt;/entry&gt; &lt;entry morerows="1"&gt;B&lt;/entry&gt; &lt;entry morerows="1"&gt;C&lt;/entry&gt; &lt;entry&gt;D&lt;/entry&gt; &lt;entry&gt;E&lt;/entry&gt; &lt;entry&gt;F&lt;/entry&gt; &lt;entry&gt;G&lt;/entry&gt; &lt;/row&gt; &lt;row&gt; &lt;entry&gt;2D&lt;/entry&gt; &lt;entry&gt;2E&lt;/entry&gt; &lt;entry&gt;2F&lt;/entry&gt; &lt;entry&gt;2G&lt;/entry&gt; &lt;/row&gt; &lt;row&gt; &lt;entry morerows="1"&gt;3B&lt;/entry&gt; &lt;entry morerows="1"&gt;3C&lt;/entry&gt; &lt;entry&gt;3D&lt;/entry&gt; &lt;entry&gt;3E&lt;/entry&gt; &lt;entry&gt;3F&lt;/entry&gt; &lt;entry&gt;3G&lt;/entry&gt; &lt;/row&gt; &lt;row&gt; &lt;entry&gt;4D&lt;/entry&gt; &lt;entry&gt;4E&lt;/entry&gt; &lt;entry&gt;4F&lt;/entry&gt; &lt;entry&gt;4G&lt;/entry&gt; &lt;/row&gt; &lt;row&gt; &lt;entry morerows="1" nameend="col6" namest="col2"&gt;3G - 4G&lt;/entry&gt; &lt;entry morerows="1"&gt;5G&lt;/entry&gt; &lt;/row&gt; &lt;/tbody&gt; &lt;/tgroup&gt; &lt;/table&gt; </code></pre> <p>Output:</p> <pre><code>&lt;w:tbl&gt; &lt;w:tr&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge w:val="restart"/&gt; &lt;/w:tcPr&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;A&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge w:val="restart"/&gt; &lt;/w:tcPr&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;B&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge w:val="restart"/&gt; &lt;/w:tcPr&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;C&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;D&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;E&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;F&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;G&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;/w:tr&gt; &lt;w:tr&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;2D&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;2E&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;2F&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;2G&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;/w:tr&gt; &lt;w:tr&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge w:val="restart"/&gt; &lt;/w:tcPr&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;3B&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge w:val="restart"/&gt; &lt;/w:tcPr&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;3C&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;3D&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;3E&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;3F&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;3G&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;/w:tr&gt; &lt;w:tr&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;4D&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;4E&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;4F&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;4G&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;/w:tr&gt; &lt;w:tr&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:vMerge/&gt; &lt;/w:tcPr&gt; &lt;w:p/&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:tcPr&gt; &lt;w:gridSpan w:val="5"/&gt; &lt;/w:tcPr&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;3G - 4G&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;w:tc&gt; &lt;w:p&gt; &lt;w:r&gt; &lt;w:t&gt;5G&lt;/w:t&gt; &lt;/w:r&gt; &lt;/w:p&gt; &lt;/w:tc&gt; &lt;/w:tr&gt; &lt;/w:tbl&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    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