gpt4 book ai didi

xml - XSL 到 XML 循环问题

转载 作者:行者123 更新时间:2023-12-04 06:23:35 24 4
gpt4 key购买 nike

我需要循环一个 XML 文档。没有问题。
当我需要刚刚跳过的前一行中的文本时,问题就出现了。

XML 看起来像这样

<lines>
<line>
<id>1</id>
<text>Some fancy text here 1</text>
</line>
<line>
<id></id>
<text>This I need in the next line with a ID</text>
</line>
<line>
<id></id>
<text>Also need this.</text>
</line>
<line>
<id>4</id>
<text>Here we go</text>
</line>
</lines>

输出 XML 文件需要如下所示

<output>
<line>
<id>1</id>
<note>Some fancy text here 1</note>
</line>
<line>
<id>4</id>
<note>Here we go</note>
<extra>
<note>This I need in the next line with a ID</note>
<note>Also need this.</note>
</extra>
</line>
</output>

目前我手头的XSL很简单,就是把没有设置ID的那一行整理出来。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<output>
<xsl:for-each select="lines/line">
<xsl:if test="id/text() &gt; 0">
<line>
<id>
<xsl:value-of select="id" />
</id>
<note>
<xsl:value-of select="text" />
</note>
</line>
</xsl:if>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>

最佳答案

我没有拒绝完全审查您的代码:)

下面是一个更面向功能的完整 XSLT 1.0 解决方案(无过程方法)。乍一看可能很难看,但是,恕我直言,这是开始使用 XSLT 模板机制的一个很好的例子。

还使用 xsl:for-each在您的特定情况下并不是那么容易,因为在循环的某个步骤中,您希望获得所有前面的相邻同级为空 id ,不知道它们有多少是先验的。

我还使用身份模板来简化重新创建目标的工作。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity template -->
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>

<!-- match line with empty id and do not output -->
<xsl:template match="line[not(boolean(id/text()))]"/>

<!-- match line with id and build output -->
<xsl:template match="line[boolean(id/text())]">
<xsl:copy>
<xsl:copy-of select="id"/>
<xsl:apply-templates select="text"/>
<extra>
<!-- apply recursive template to the first preceding
sibling adajacent node with empty id -->
<xsl:apply-templates select="(preceding-sibling::*[1])
[name()='line' and not(boolean(id/text()))]/text"
mode="extra"/>
</extra>
</xsl:copy>
</xsl:template>

<!-- change text element to note -->
<xsl:template match="text">
<note>
<xsl:value-of select="."/>
</note>
</xsl:template>

<!-- recursive template for extra note elements -->
<xsl:template match="text" mode="extra">
<note>
<xsl:value-of select="."/>
</note>
<xsl:apply-templates select="(parent::line/preceding-sibling::*[1])
[name()='line' and not(boolean(id/text()))]/text"
mode="extra"/>
</xsl:template>

</xsl:stylesheet>

应用于您的输入,给出:
<?xml version="1.0" encoding="UTF-8"?>
<lines>
<line>
<id>1</id>
<note>Some fancy text here 1</note>
<extra/>
</line>
<line>
<id>4</id>
<note>Here we go</note>
<extra>
<note>Also need this.</note>
<note>This I need in the next line with a ID</note>
</extra>
</line>
</lines>

关于xml - XSL 到 XML 循环问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6290229/

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