我的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>
请建议......
最诚挚的问候, 安东尼
答案 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?