2
我有這個輸入XML與p標籤問題更換BR標籤
<body>
<p class="heading">
<span><tag>This text</tag>
<br/>
</span>
</p>
<p class="bodyText">
<span><tag>is</tag>
<br/>
</span>
<span><tag>meant</tag>
</span>
<span><tag>to</tag>
<br/>
</span>
</p>
<p class="bodyText">
<span>
<tag>be</tag></span>
<span>
<tag>read</tag>
<br/>
</span>
<span><tag>with</tag></span>
<span><tag>some</tag></span>
<span><tag>inline</tag><br/></span>
<span class="italic">
<tag>styles</tag>
<br/>
<tag>the</tag>
<br/>
<tag>end</tag>
</span>
</p>
</body>
我希望得到這個輸出 - 用p標籤更換BR標籤和繼承所有/任何類
<body>
<p class="heading">
<span>
<tag>This text</tag>
</span>
</p>
<p class="bodyText">
<span>
<tag>is</tag>
</span>
</p>
<p class="bodyText">
<span>
<tag>meant</tag>
</span>
<span>
<tag>to</tag>
</span>
</p>
<p class="bodyText">
<span>
<tag>be</tag>
</span>
<span>
<tag>read</tag>
</span>
</p>
<p class="bodyText">
<span>
<tag>with</tag>
</span>
<span>
<tag>some</tag>
</span>
<span>
<tag>inline</tag>
</span>
</p>
<p class="bodyText">
<span class="italic">
<tag>styles</tag>
</span>
</p>
<p class="bodyText">
<span class="italic">
<tag>the</tag>
</span>
</p>
<p class="bodyText">
<span class="italic">
<tag>end</tag>
</span>
</p>
</body>
XSLT :迄今爲止有一些極好的建議(儘管XML輸入較簡單);
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="p">
<xsl:apply-templates select="span[1]" mode="group"/>
</xsl:template>
<xsl:template match="span[not(br)]" mode="group">
<p>
<xsl:apply-templates select="."/>
</p>
<xsl:apply-templates select="following-sibling::span[br][1]/following- sibling::span[1]" mode="group"/>
</xsl:template>
<xsl:template match="span[br]" mode="group">
<p>
<xsl:apply-templates select="."/>
</p>
<xsl:apply-templates select="following-sibling::span[1]" mode="group"/>
</xsl:template>
<xsl:template match="span[not(br)]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
<xsl:apply-templates select="following-sibling::span[1]"/>
</xsl:template>
<xsl:template match="span/br"/>
</xsl:stylesheet>
哪些起來,直到輸入的最後一個跨距標籤最後一組BR的作品。我也有這樣一個很好的建議,它使用一個鍵來做同樣的事情;
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:key name="para" match="span" use="generate-id(following-sibling::br[1])" />
<xsl:template match="/">
<body>
<xsl:apply-templates select="body/p" />
</body>
</xsl:template>
<xsl:template match="p">
<xsl:apply-templates select="br" />
<xsl:if test="span[not(following-sibling::br)]">
<p>
<xsl:apply-templates select="span[not(following-sibling::br)]" />
</p>
</xsl:if>
</xsl:template>
<xsl:template match="br">
<p>
<xsl:apply-templates select="key('para', generate-id())" />
</p>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
...仍然是同樣的問題。如果有人能指出我需要用XSLT做什麼,我將非常感激。對不起,如果這看起來像一個轉發,但我真的卡住了。
千恩萬謝