我想使用逐項列表,而不是硬中斷,見例如:計數前面的節點返回意外的結果
<para>line1<?linebreak?>
line2<?linebreak?>
line3</para>
不過,我遇到我這樣可防止處理第二行遞歸模板怪異的行爲正確。我創建了簡化的測試用例 - 不再遞歸。如果count(preceding::processing-instruction('linebreak')) = 0
表達式以這種方式使用,則不返回任何內容,但我期望第二行。
<line>line1</line><node>
line2<?linebreak?>
line3</node>
line2
那<node>
這個元件是用於調試的。它證實了我處理預期數據。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="para[processing-instruction('linebreak')]">
<xsl:call-template name="getLine">
<xsl:with-param name="node" select="./node()"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="getLine">
<xsl:param name="node"/>
<line>
<xsl:copy-of
select="$node/self::processing-instruction('linebreak')[not(preceding::processing-instruction('linebreak'))]/preceding::node()"
/>
</line>
<xsl:call-template name="getSecondLine">
<xsl:with-param name="node"
select="$node/self::processing-instruction('linebreak')[not(preceding::processing-instruction('linebreak'))]/following::node()"
/>
</xsl:call-template>
</xsl:template>
<xsl:template name="getSecondLine">
<xsl:param name="node"/>
<node>
<xsl:copy-of select="$node"/>
</node>
<xsl:copy-of
select="$node/self::processing-instruction('linebreak')[count(preceding::processing-instruction('linebreak')) = 0]/preceding::node()"
/>
</xsl:template>
</xsl:stylesheet>
在Saxon HE/EE 9.6.0.7(在Oxygen XML Editor 18中)測試。
獨立於您當前的XSLT代碼,請提供您期望的輸入示例的參考輸出。 – Tomalak
那麼你想實現什麼?在XSLT/XPath 2.0世界中,我會考慮一個分項列表,它只是一個值序列,例如'('line1','line2','line3')'。你想把你輸入的樣本變換成一系列字符串還是一系列'line'元素?爲什麼該段落包含處理指令以指示文本中的換行符和換行符?有沒有比純文本節點和''para''元素內的''處理指令更復雜的東西? –
@MartinHonnen行是混合內容,而不是純文本。我試圖在PI之前複製所有節點,並將其餘節點傳遞給下一次迭代。然而,這個「休息」的行爲與第一次迭代不同。 –