我试图在可能包含子节点的元素上使用analyst-string。这是源文件的代码段:DevTools
这就是我想要得到的:
<year>
1975 music
</year>
<year>
1985<genre>rock</genre>music
</year>
<year>
2005 music
</year>
以下代码正确匹配这3种情况,但是我缺少一些东西来复制文本和year元素下的可能的子节点:
<year>
70's music
</year>
<year>
80's<genre>rock</genre> music
</year>
这就是我得到的:
<xsl:template match="year">
<xsl:variable name="item" select="."/>
<xsl:analyze-string select="." regex="19(\d)\d">
<xsl:matching-substring>
<xsl:variable name="decade">
<xsl:value-of select="concat(regex-group(1),'0''s')"/>
</xsl:variable>
<year>
<xsl:value-of select="concat($decade,regex-group(2))"/>
<genre><xsl:value-of select="$item/genre"/>
</genre>
</year>
</xsl:matching-substring>
<xsl:non-matching-substring> </xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
在此先感谢您的帮助!
答案 0 :(得分:2)
似乎可以将文本子级匹配为年份模式:
<xsl:template match="year[not(matches(., $pattern))]"/>
<xsl:template match="year/text()[matches(., $pattern)]">
<xsl:value-of select="replace(., $pattern, '$10''s')"/>
</xsl:template>
那给
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"
version="3.0">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:param name="pattern" as="xs:string">19(\d)\d</xsl:param>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="year[not(matches(., $pattern))]"/>
<xsl:template match="year/text()[matches(., $pattern)]">
<xsl:value-of select="replace(., $pattern, '$10''s')"/>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/gWmuiJV给出结果
<root>
<year>
70's music
</year>
<year>
80's<genre>rock</genre>music
</year>
</root>
对于与XSLT 2兼容的解决方案,您需要拼写用作身份转换模板的xsl:mode
声明,例如http://xsltransform.hikmatu.com/jyH9rLQ的声明。