2009-09-02 21 views
7

我有一些处理的指令我的XML内容中的元素,例如:如何在XSLT处理指令匹配元素?

<?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> 

请咨询....

最好的问候, 安东尼

回答

17

默认情况下,XSLT处理器将忽略督察 - 在为了做到与它们匹配有趣和有用的东西,你可以使用处理指令比赛在你的模板:

<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> 
+0

对不起,它不工作,我刚开始没有任何元素的内容。 – Antony 2009-09-02 10:44:46

+0

嗨,我没有得到内容时,我使用你的第二个代码...我只获得这个元素... – Antony 2009-09-02 12:32:06

+1

所以它的工作,然后!我的代码只是一个片段来展示你如何去做这件事。 – butterchicken 2009-09-02 14:29:52

2

这本身就是一个不好的设计,你似乎想要匹配的开始/结束标记,但没有使用可用的,如果你要使用一个实际的XML元素的方法。

虽然您可以将开始/结束处理指令与xpath难以匹配,以便在所述处理指令之间找到节点。如果你有嵌套或重复这样的说明,它可能会变得更加困难。并在这一天结束,这一切正在做的是试图复制什么XML已经做到不使用XML?