对不起,我的英语不好。我正在寻找一个提示或xsl中的函数,它可以发现标记后面是否有空格,如果是真的,该函数应该生成一些东西。
背景:我想用XML编写歌曲的歌词,因为有各种Musik程序,它们需要一种特殊的语法来处理歌词。
例如,软件"SongSheet生成器“需要这样的语法:
[C]Where have all the [Am]flowers gone用于显示(和转置) C- an Am-Akkord。
标记C和我喜欢<akkord>C</akkord>,并像这样编写xsl是没有问题的
<xsl:template match="akkorde">
<span style="color:green">[<xsl:value-of select="." />]</span>
</xsl:template> 很久很好(我们在德国说)。
现在我想使用Notation-Programm "LilyPond“中的歌词,它需要以下语法:
Where4 have8 all2 the8 flow-8ers4 gone?2通过这样写,软件知道,单词"Where“是四分之一音符,"have”是1/8音符……(LilyPond在适当的注释下设置单词)
你看,“花”这个词是用"-“分隔的。这是因为这个词有两个音符(或两个音节)。(在Lilypond中,每个点,逗号,问号...在音节持续时间之前设置)
在此背景下,我想这样编写我的XML:
<akkord>C</akkord>Where<duration>4</duration> have<duration>8</duration> all<duration>2</duration> the<duration>8</duration> <akkord>Am</akkord>flow<duration>8</duration>ers<duration>4</duration> gone<duration>2</duration>现在我需要一个XSL函数,该函数设置“flow-8ers4”中的分隔符/连字符(-),前提是单词中存在持续时间标记。如果持续时间标记位于单词末尾,如“Where4”,则不应出现分隔符。
我认为“如果持续时间标签后面没有空格,那么它一定在单词中,然后函数应该在持续时间标签之前放置分隔符/连字符(-)”。但是你可以在上面看到在歌词的结尾有一个问号。因此,函数还必须查看,如果第一个符号是空格或点,则逗号...
当然,我也可以标记Seperator。但这样做还有更多的工作要做。我希望有一个函数可以让它变得更好/更快。
希望你能理解我的写作。谢谢你的提示。
发布于 2017-09-24 15:19:54
XSLT不能看到标签,它只能看到元素节点。写为<duration>4</duration>的元素有两个标记,一个开始标记和一个结束标记。现在为了理解你的问题,我需要看看你所说的“标签”是什么意思,我想你的意思是“元素节点”。
您可以使用测试来测试当前元素节点后面是否紧跟以一组特定字符之一开头的文本节点:
<xsl:if test="following-sibling::node()[1][self::text()[translate(substring(.,1,1), ' ?!.,:;()', '') = '']"/>在XSLT 2.0中,可以使用正则表达式对测试进行泛化:
matches(., '^\W')测试字符是否为“非单词”字符(一大类标点符号、分隔符和符号)。
很难说这是否完全满足您的需求。例如,当duration元素后面紧跟另一个元素节点,而不是文本节点时,我不清楚会发生什么。
https://stackoverflow.com/questions/46384354
复制相似问题