10

我的 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>

请指教....

最好的问候,安东尼

4

2 回答 2

18

默认情况下,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>
于 2009-09-02T10:30:05.287 回答
2

这本质上是一个糟糕的设计,您似乎正在尝试匹配开始/结束标签,但如果您要使用实际的 xml 元素,则没有使用可用的方法。

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

于 2009-09-02T10:51:03.373 回答