使用xslt确定xml中的列数

时间:2018-08-17 10:56:37

标签: xml xslt

我有无法更改的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可以实现吗?

2 个答案:

答案 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中则非常棘手-而且由于您没有告诉我们所需的版本,因此我也不会详细介绍。