2015-11-19 80 views
0

我使用XSLT做一個HTML到XML轉換添加新節點,在HTML輸入我有喜歡的內容如下,分析文本()節點和XSLT

<p>An image outside a paragraph is placed into an <em>Element Image Frame</em>. If there are no (or not enough) <em>Element Image Frames</em> then the image is ignored and a warning is logged.</p> 

使用XSL,我需要的是,如果<em>節點之前或之後有空間,則應將這些節點替換爲<space/>節點。所以預期輸出,

<p>An image outside a paragraph is placed into an<space/><Italic>Element Image Frame</Italic>. If there are no (or not enough)<space/><Italic>Element Image Frames</Italic><space/>then the image is ignored and a warning is logged.</p> 

注意這裏是第一<em>節點之後沒有空間,所以沒有<space/>增加。

我想我可以使用XSLT正則表達式,但我努力在<em>節點之前和之後選擇兩個空格來編寫正則表達式。

<xsl:template match="p/text()"> 
     <xsl:analyze-string select="." regex="^(&#x20;)"> 
      <xsl:matching-substring> 
       <xsl:choose> 
        <xsl:when test="regex-group(1)"> 
         <space/> 
        </xsl:when>     
       </xsl:choose> 
      </xsl:matching-substring> 
      <xsl:non-matching-substring> 
       <xsl:value-of select="."/> 
      </xsl:non-matching-substring> 
     </xsl:analyze-string> 
    </xsl:template> 

任何人都可以建議我做這件事的方法..

回答

2

作爲條件可以與starts-with和/或ends-with進行檢查,而且涉及一定同級元素我想簡單地寫模板與匹配圖案的存在:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

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

<xsl:template match="p/text()[starts-with(., ' ') and preceding-sibling::node()[1][self::em]]"> 
    <space/> 
    <xsl:value-of select="substring(., 2)"/> 
</xsl:template> 

<xsl:template match="p/text()[ends-with(., ' ') and following-sibling::node()[1][self::em]]"> 
    <xsl:value-of select="substring(., 1, string-length() - 1)"/> 
    <space/> 
</xsl:template> 

<xsl:template match="p/text()[starts-with(., ' ') and preceding-sibling::node()[1][self::em] and 
           ends-with(., ' ') and following-sibling::node()[1][self::em]]" priority="5"> 
    <space/> 
    <xsl:value-of select="substring(., 2, string-length() - 1)"/> 
    <space/> 
</xsl:template> 

</xsl:stylesheet> 
0

的空格的正確選擇是([\s\t]+)$其中說,至少有一個空格(空格或製表符)在應該匹配的結尾,然後可以更換。不過,我沒有資源用你的特定代碼來測試它。