php - XSLT/Xpath : Selecting a preceding comment

标签 php xslt select xpath xml-comments

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

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

我的问题是我不知道如何选择每个 block 标签上方的注释。我有以下 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>

我正在尝试的输出是:

===苹果===
区 block 1
===香蕉===
区 block 2
===橙子===
区 block 3

但我能得到的最好的是:

===苹果===
===香蕉===
===橙子===
区 block 1
===苹果===
===香蕉===
===橙子===
区 block 2
===苹果===
===香蕉===
===橙子===
区 block 3

如果这有什么区别的话,我正在使用 PHP。

最佳答案

您的样式表有点过于复杂。

您应该尝试下面的样式表,您会发现它与您想要的输出相匹配!

<xsl:template match="//blocks">
        <xsl:apply-templates select="block" />
</xsl:template>
<xsl:template match="block">
    <xsl:apply-templates select="preceding-sibling::comment()[1]" />
    <xsl:value-of select="./@name" />
</xsl:template>
<xsl:template match="comment()">
    <xsl:value-of select="."></xsl:value-of>
</xsl:template>

此代码始终匹配从当前 block 标记之前开始的 1 或 0 个注释。

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

相关文章:

php - 查询绑定(bind)在 CodeIgniter 3 中不起作用

php - 如何将 WordPress 帖子水平显示为 3 列?

php - WordPress - Breadcrumb NavXT 类别问题

xslt - 如何从文档中删除<b/>

XPATH 未找到时返回默认值

php - 从 MYSQL 选择某些 ID 并保存为 PHP Vars

php - 如何在整个数据库中搜索数据

xml - XSLT 应用模板问题

MySQL 查询 SELECT 多行

MySQL高效多表多索引选择