我有以下格式的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>
我正在尝试的输出是:
=== apples ===
块1
===香蕉===
块2
=== oranges ===
block3
但我能得到的最好的是:
=== apples ===
===香蕉===
=== oranges ===
块1
=== apples ===
===香蕉===
=== oranges ===
块2
=== apples ===
===香蕉===
=== oranges ===
block3
如果有任何不同,我正在使用PHP。
答案 0 :(得分:3)
你的样式表有点过于复杂。
您应该尝试下面的样式表,您会发现它与您想要的输出相匹配!
<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>
此代码始终匹配在当前块标记之前开始的1或0条注释。
答案 1 :(得分:0)
您也可以在第一个应用模板而不是第二个应用模板中应用注释模板,以便它按顺序发生 - 此外,此解决方案还取决于源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> </xsl:text>