2016-02-26 30 views
0

我有一個XML文件如下。如何使用XSL在xml中查找以前的標籤?

<p>Sample Content 1</p> 
<p>Sample Content 2</p> 
<sec level="1">Sample Content 3</sec> 
<p>Sample Content 4</p> 
<p>Sample Content 5</p> 

XSL轉換:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="p"> 
<xsl:choose> 
    <xsl:when test="preceding-sibling::p"> 
    <p class="indent"><xsl:apply-templates /></p> 
    </xsl:when> 
    <xsl:otherwise> 
    <p class="noindent"><xsl:apply-templates /></p> 
    </xsl:otherwise> 
</xsl:choose> 
</xsl:template> 
</xsl:stylesheet> 

我需要的輸出格式如下。

<p class="noindent">Sample Content 1</p> 
<p class="indent">Sample Content 2</p> 
<h1>Sample Content 3</h1> 
<p class="noindent">Sample Content 4</p> 
<p class="indent">Sample Content 5</p> 

請告訴上述概念的想法。所以我必須找出以前的標籤格式..

在此先感謝。

+0

爲什麼你需要找到以前的標籤?問題中添加您的xsl實驗。 – vels4j

+0

您使用的xslt版本? – vels4j

+0

你有答案。如果你使用撒克遜,你可以有一個計數器驗證條件。 – vels4j

回答

2

移動條件爲匹配模式和更改條件preceding-sibling::*[1][self::p]

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="p"> 
     <p class="noindent"> 
      <xsl:apply-templates/> 
     </p> 
    </xsl:template> 
    <xsl:template match="p[preceding-sibling::*[1][self::p]]"> 
     <p class="indent"> 
      <xsl:apply-templates/> 
     </p> 
    </xsl:template> 
</xsl:transform> 
0

你唯一的錯誤是認爲preceding-sibling::p意味着「直接前置兄弟是p」的時候,其實它的意思是「有在前面的兄弟姐妹中至少有一個p「。在您的測試中用preceding-sibling::*[1]/self::p代替preceding-sibling::p

Martin Honnen建議的結構更改(使用多個模板而不是一個)通常是一個好主意,但與您的代碼的失敗無關,因此無法提供您期望的結果。

相關問題