我有无法更改的xml数据。
<Root xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/" xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/">
<Notes>
<Note03>
<Note03_Line01_Col00>3</Note03_Line01_Col00>
<Note03_Line01_Col01>Contingent liabilities</Note03_Line01_Col01>
<Note03_Line01_Col02/>
<Note03_Line01_Col03/>
<Note03_Line01_Col04/>
<Note03_Line02_Col00/>
<Note03_Line02_Col01>At the year end there are no contingent liabilities.</Note03_Line02_Col01>
<Note03_Line02_Col02/>
<Note03_Line02_Col03/>
<Note03_Line02_Col04/>
<Note03_Line03_Col00/>
<Note03_Line03_Col01></Note03_Line03_Col01>
<Note03_Line03_Col02/>
<Note03_Line03_Col03/>
<Note03_Line03_Col04/>
</Note03>
</Notes>
</Root>
我的目标是确定此摘录具有的正确列数,并对其应用属性集以反映该列数。
我已经设置了属性,我的问题是我无法确定如何确定列号。使用xslt可以实现吗?
答案 0 :(得分:0)
要简单地将数字2
计算为Note03
元素的非空不同子元素的数目,就可以使用XPath:
count(distinct-values(Root/Notes/Note03/*[normalize-space()]/replace(local-name(), '^.*_Col', '')))
在大多数情况下,假设您希望将XML转换为更多的表/行/单元格,例如,我确信带有xsl:for-each-group
的XSLT 2/3可以使用和处理该输入XML。
答案 1 :(得分:0)
您说不能更改XML,但是可以-您是XSLT处理器的骄傲拥有者。
通过这种输入,通常最好先将其转换为更易于管理的内容,例如
<Notes>
<Note03>
<Note03 line="1" col="0">3</Note03>
<Note03 line="1" col="1">Contingent liabilities</Note03>
<Note03 line="1" col="2"/>
<Note03 line="1" col="3"/>
... etc ...
</Notes>
我不确定如何定义所需的“列数”(也许@col的最大值+ 1?还是任何行的不同@col值的最大数目?),但是现在可以使用标准的XSLT分组技术。这当然意味着在XSLT 2.0中非常容易实现,而在XSLT 1.0中则非常棘手-而且由于您没有告诉我们所需的版本,因此我也不会详细介绍。