如何匹配XSLT中的processing-instruction元素?

时间:2009-09-02 10:19:45

标签: xslt xpath processing-instruction

我的xml内容中有一些处理指令元素,例如:

<?legalnoticestart?>
<?sourcenotestart?>
<para>Content para</para>
<?sourcenoteend?>
<?literallayoutstart?>
<para>body content </para>
<?literallayoutend?>
<?legalnoticeend?>

我如何匹配这些元素并以下面所需的元素格式获取内容?

必需的xml:

<legalnotice>
<sourcenote>
<p>Content para</p>
</sourcenote>
<literallayout>
<p>body content</p>
</literallayout>
</legalnotice>

请建议......

最诚挚的问候, 安东尼

2 个答案:

答案 0 :(得分:17)

默认情况下,XSLT处理器会忽略PI - 为了匹配它们以便做有趣和有用的事情,您可以在模板中使用处理指令匹配:

<xsl:template match="processing-instruction('legalnoticestart')">
  <legalnotice><xsl:value-of select="."/></legalnotice>
</xsl:template>

例如,以下样式表:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="doc">
        <xsl:apply-templates select="processing-instruction('legalnoticestart')" />
    </xsl:template>

    <xsl:template match="processing-instruction('legalnoticestart')">
        <legalnotice><xsl:value-of select="."/></legalnotice>
    </xsl:template>
</xsl:stylesheet>

有了这份文件:

<doc>
   <?legalnoticestart?>
   <?legalnoticeend?>
</doc>

收率:

<?xml version="1.0"?>
<legalnotice>
</legalnotice>

答案 1 :(得分:2)

这本质上是一个糟糕的设计,你似乎试图匹配开始/结束标记,但如果你使用的是实际的xml元素,则不使用可用的方法。

虽然您可以使用xpath匹配开始/结束处理指令,但难以在所述处理指令之间定位节点。如果你有嵌套或重复这样的说明,它会变得更加困难。在一天结束时,所有这一切都是试图复制xml已经做的事情而不使用xml?