Это преобразование :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:strip-space elements="*"/>
<xsl:variable name="vtextPostM" select="//text()[preceding::m]"/>
<xsl:variable name="vtextPreN" select="//text()[following::n]"/>
<xsl:variable name="vtextBN-MandN" select=
"$vtextPostM[count(.|$vtextPreN) = count($vtextPreN)]"/>
<xsl:variable name="vNL" select="'
'"/>
<xsl:variable name="vQ">"</xsl:variable>
<xsl:template match="/">
<xsl:for-each select="$vtextBN-MandN">
<xsl:value-of select=
"concat($vNL, 'Id: ', $vQ, generate-id(), $vQ,
'Text: ', $vQ, ., $vQ)
"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
при применении к предоставленному XML-документу дает правильный и требуемый результат :
Id: "IDAOZDLB"Text: "third text node
"
Id: "IDAQZDLBIDAQZDLB"Text: "
One more text node
"
Id: "IDAUZDLBIDAUZDLB"Text: "
This is my fourth text node
"
Id: "IDAYZDLB"Text: "
This is my fifth "
Обратите внимание на использование метода Кайса пересечения наборов узлов:
$ns1[count(.|$ns2)=count($ns2)]
выбирает все узлы, которые принадлежат как к набору узлов $ns1
, так и к набору узлов $ns2
.