節番号のあるテキストがあります。
ここで、テキストを詩番号で区切り、単一の詩に ID として番号を付けたいと思います。
ソースから番号を取得する方法がわからなかったので、連続した番号を付けましたが、可能であれば、ソースから実際の番号を割り当ててもらいたいです。そのため、1 つの節が欠落している場合、XSLT は連続してカウントされず、番号がスキップされます。
しかし、それ以外にも、<l n="1"/>
最初に空の要素を取得するという問題があります。
私の XSLT も何らかの形で一致<p>
すると思うので、実際の n="1" は n="2" になります。
どうすれば解決できますか?
私の情報源:
<root> <p>1 This is 2 a <hi rend="bold">beautiful</hi> example 3 poem 4 for showing! 5 my problem</p> </root>
で変換:
<xsl:stylesheet version="2.0" exclude-result-prefixes="xs"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="node() | @*">
<xsl:copy>
<xsl:apply-templates select="@* |node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="root/p">
<p>
<xsl:variable name="words" select="tokenize(text(),'(1|2|3|4|5|6|7|8|9|0)')" as="xs:string*"/>
<xsl:for-each select="1 to xs:integer(floor(count($words) div 1))">
<xsl:variable name="vIndex" select="(.)" as="xs:integer"/>
<l><xsl:attribute name="n"
select="position()"/>
<xsl:value-of select="$words[$vIndex]"/>
</l>
</xsl:for-each>
</p>
</xsl:template>
</xsl:stylesheet>
私が得るものは次のとおりです。
<root>
<p>
<l n="1"/>
<l n="2"> This is </l>
<l n="3"> a beautiful example </l>
<l n="4"> poem </l>
<l n="5"> for showing </l>
<l n="6"> my problem</l>
</p>
</root>
必要な出力は次のとおりです。
<root>
<p>
<l n="1"> This is </l>
<l n="2"> a <hi rend="bold">beautiful</hi> example </l>
<l n="3"> poem </l>
<l n="4"> for showing! </l>
<l n="5"> my problem</l>
</p>
</root>
編集:例に要素を追加しました。