0
我在論壇中使用了一些代碼來包裝一個節點內的一些子節點,但現在我正在努力將標題放入根節點。這是我要轉換的XML的例子:在匹配較低節點後將元素放入根節點
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<A>
<B>
<C>stuff</C>
<D>stuff1</D>
<E>stuff2</E>
</B>
<B>
<C>stuff3</C>
<D>stuff4</D>
<E>stuff5</E>
</B>
</A>
,這就是我需要:
<?xml version="1.0"?>
<A>
<H>heading</H>
<B>
<C>stuff</C>
<ExtraInfo>
<D>stuff</D>
<E>stuff2</E>
</ExtraInfo>
</B>
<B>
<C>stuff3</C>
<ExtraInfo>
<D>stuff4</D>
<E>stuff5</E>
<ExtraInfo>
</B>
</A>
這是我使用xsl:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ex="http://exslt.org/dates-and-times" extension-element-prefixes="ex">
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="B/*"/>
<xsl:template match="B/C">
<xsl:call-template name="identity"/>
</xsl:template>
<xsl:template match="B/*[not(self::C)][1]">
<ExtraInfo>
<xsl:apply-templates select="D/*"
mode="ExtraInfo"/>
<D><xsl:value-of select="//D"/></D>
<xsl:apply-templates select="E/*"
mode="ExtraInfo"/>
<E><xsl:value-of select="//E"/></E>
</ExtraInfo>
</xsl:template>
<xsl:template match="B/*" mode="ExtraInfo">
<xsl:call-template name="identity"/>
</xsl:template>
</xsl:stylesheet>
,這是結果爲:
<?xml version="1.0" ?>
- <A>
- <B>
<C>stuff</C>
- <ExtraInfo>
<D>stuff1</D>
<E>stuff2</E>
</ExtraInfo>
</B>
- <B>
<C>stuff3</C>
- <ExtraInfo>
<D>stuff1</D>
<E>stuff2</E>
</ExtraInfo>
</B>
</A>
如果我嘗試爲根節點放置一個模板,我得到一個錯誤告訴我,我不能有2個更高級別的元素,或者一些這樣的元素。我怎樣才能插入標題?
你好,非常感謝,這工作,但我只注意到節點下 stuff3 我應該得到「stuff4」和「stuff5」不「stuff1」和「stuff2」。我想知道你看到了什麼問題嗎? –
Geoff
那麼' '是錯誤的,您寧願要使用' ' 。 ' '也是如此。另一方面,該模板中的整個代碼看起來有點複雜,我寧願寫一個匹配'B'的模板,然後將模板應用於'C',輸出包裝元素'ExtraInfo'並通過將模板應用於'D'和'E':' xsl:template>'。 –
我知道。我只是對這個東西感到陌生,並且感覺我的方式。有什麼好的教程你會推薦? w3c有點基本,規則沒有解釋得很好。我想我將不得不投資一本好書。 – Geoff