gpt4 book ai didi

php - XSLT/Xpath : Selecting a preceding comment

转载 作者:行者123 更新时间:2023-12-03 16:13:39 24 4
gpt4 key购买 nike

我有以下格式的 XML,我想重新格式化:

<blocks>
<!-- === apples === -->
<block name="block1">
...
</block>
<!-- === bananas === -->
<block name="block2">
...
</block>
<!-- === oranges === -->
<block name="block3">
...
</block>
</blocks>

我的问题是我不知道如何选择每个块标记上方的注释。我有以下 XSL:
<xsl:template match="//blocks">
<xsl:apply-templates select="block" />
</xsl:template>
<xsl:template match="block">
<xsl:apply-templates select="../comment()[following-sibling::block[@name = ./@name]]" />
<xsl:value-of select="./@name" />
</xsl:template>
<xsl:template match="comment()[following-sibling::block]">
<xsl:value-of select="."></xsl:value-of>
</xsl:template>

我正在尝试的输出是:

=== 苹果 ===
块1
=== 香蕉 ===
块2
=== 橘子 ===
块3

但我能得到的最好的是:

=== 苹果 ===
=== 香蕉 ===
=== 橘子 ===
块1
=== 苹果 ===
=== 香蕉 ===
=== 橘子 ===
块2
=== 苹果 ===
=== 香蕉 ===
=== 橘子 ===
块3

如果这有什么不同,我正在使用 PHP。

最佳答案

您也可以在第一个应用模板而不是第二个应用模板中应用评论模板,以便按顺序发生 - 此外,此解决方案取决于源 xml 中数据的顺序。

<xsl:template match="//blocks">
<xsl:apply-templates select="block | comment()" />
</xsl:template>

PS:- 您可以避免在表达式中使用“//”,因为它可能不是最佳的。

[编辑] 完整的样式表
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="//blocks">
<xsl:apply-templates select="block | comment()"/>
</xsl:template>
<xsl:template match="block">
<xsl:value-of select="./@name"/>
</xsl:template>
<xsl:template match="comment()">
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>

如果需要换行,请在块和注释中打印值后添加以下语句。
<xsl:text>&#10;</xsl:text>

关于php - XSLT/Xpath : Selecting a preceding comment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1686256/

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