2009-09-02 40 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?