gpt4 book ai didi

XSLT:将未分组的数据拆分成 block

转载 作者:行者123 更新时间:2023-12-04 06:10:48 26 4
gpt4 key购买 nike

我需要转

   <question>
<static><![CDATA[Static Data]]></static>

<debit-row />
<debit-row />
<credit-row />

<header><![CDATA[Header HTML 1]]></header>
<debit-row />
<debit-row />
<credit-row />
</question>

进入
<p>Static Data</p>
<ul>
<li>
<table>
<tr><td> debit row </td></tr>
<tr><td> credit row </td></tr>
<tr><td> credit row </td></tr>
</table>
</li>
<li> Header HTML 1
<table>
<tr><td> debit row </td></tr>
<tr><td> debit row </td></tr>
<tr><td> credit row </td></tr>
</table>
</li>
</ul>

本质上,标题或借方行指示新块的开始。每个块都是一个列表项。每组或每行都是一个表(通常,贷记行总是排在最后,因此很容易判断何时开始该表)。

XSLT 和 XPATH 似乎非常困难,我很难找到我想做的任何事情,所以如果有人有很好的引用,我也会很感激。

我已经开始使用这个 xsl:
<xsl:template match="question">
<xsl:apply-templates select="static|header|debit-row[preceding-sibling::*[1] != header]" />
</xsl:template>

这不是一个好的开始,因为模板根本不应用于任何借记行,但它们应该应用于第一个借记行(它前面没有标题元素)。那个表达有错吗?

即使我让它起作用,我也需要找到一种方法来说“如果这是第一个标题或借记行,则打开 <ul>”,并且我不确定在应用标题时如何做到这一点/借方行模板。 debit-row 每个都有自己的 xml 要应用(它需要一个表行和 td)。我还必须在第一个借方行之前和最后一个贷方行之后适本地打开和关闭表格。

我会非常感谢任何帮助,因为我什至无法使上面的简单 xpath 表达式正常工作。

最佳答案

一、XSLT 1.0解决方案 :

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kFollowing"
match="*[not(self::static or self::header)]"
use="generate-id(preceding-sibling::*
[self::static
or
self::header
][1]
)"/>

<xsl:template match="/*[static]">
<p><xsl:value-of select="static"/></p>
<ul>
<xsl:apply-templates select="static|header"/>
</ul>
</xsl:template>

<xsl:template match="static|header">
<li>
<xsl:value-of select=
"concat(self::header, '&#xA;')"/>
<table>
<xsl:apply-templates
select="key('kFollowing', generate-id())"/>
</table>
</li>
</xsl:template>

<xsl:template match=
"*/*[not(self::static or self::header)]">
<tr>
<td>
<xsl:value-of select=
"translate(name(),'-', ' ')"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>

当应用于提供的 XML 文档时 :
<question>
<static><![CDATA[Static Data]]></static>
<debit-row />
<debit-row />
<credit-row />
<header><![CDATA[Header HTML 1]]></header>
<debit-row />
<debit-row />
<credit-row />
</question>

产生想要的、正确的结果 :
<p>Static Data</p>
<ul>
<li>

<table>
<tr>
<td>debit row</td>
</tr>
<tr>
<td>debit row</td>
</tr>
<tr>
<td>credit row</td>
</tr>
</table>
</li>
<li>Header HTML 1
<table>
<tr>
<td>debit row</td>
</tr>
<tr>
<td>debit row</td>
</tr>
<tr>
<td>credit row</td>
</tr>
</table>
</li>
</ul>

说明 :位置分组使用一个键来定义属于一个组的所有元素。

二、 XSLT 2.0 解决方案 :
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>

<xsl:template match="/*[static]">
<p><xsl:value-of select="static"/></p>
<ul>
<xsl:for-each-group select="*"
group-starting-with="static|header">
<li>
<xsl:value-of separator="&#xA;" select=
"current-group()[1][self::header], ''"/>
<table>
<xsl:apply-templates
select="current-group()[position() gt 1]"/>
</table>
</li>
</xsl:for-each-group>
</ul>
</xsl:template>

<xsl:template match=
"*/*[not(self::static or self::header)]">
<tr>
<td>
<xsl:value-of select=
"translate(name(),'-', ' ')"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>

当此 XSLT 2.0 转换应用于同一个 XML 文档(上图)时,同样会产生相同的正确结果 :
<p>Static Data</p>
<ul>
<li>
<table>
<tr>
<td>debit row</td>
</tr>
<tr>
<td>debit row</td>
</tr>
<tr>
<td>credit row</td>
</tr>
</table>
</li>
<li>Header HTML 1
<table>
<tr>
<td>debit row</td>
</tr>
<tr>
<td>debit row</td>
</tr>
<tr>
<td>credit row</td>
</tr>
</table>
</li>
</ul>

说明 :使用 XSLT 2.0 <xsl:for-each-group>带有 group-starting-with 的指令属性。还使用标准 XSLT 2.0 函数 current-group() .

关于XSLT:将未分组的数据拆分成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814103/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com