xml - 使用 XSLT 将标签元素拆分为不同名称的标签
问题描述
我有一个<Content>
标签,其中有一个字符串,例如:
"Hello how do you do END"
我正在尝试做的是将该字符串拆分为 "\t" 并将每个单词放入一个不同的命名标签中,如下所示:
<a>Hello</a>
<b>how</b>
<c>do</c>
我使用 tokenize 拆分它们:
<xsl:template match="*:Content/text()">
<xsl:for-each select="tokenize(.,'\t')">
<b xmlns="">
<xsl:sequence select="."/>
</b>
</xsl:for-each>
</xsl:template>
我只需要以后能够在不知道它们的情况下区分这些词。有人能帮我吗?
解决方案
您可以position()
使用正确的格式格式化,例如
<xsl:template match="test">
<xsl:copy>
<xsl:for-each select="tokenize(., '\s+')">
<xsl:element name="{format-integer(position(), 'a')}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
https://xsltfiddle.liberty-development.net/nc4NzRm
对于 XSLT 2,您可以xsl:number
用来格式化position()
:
<xsl:template match="test">
<xsl:copy>
<xsl:for-each select="tokenize(., '\s+')">
<xsl:variable name="element-name">
<xsl:number format="a" value="position()"/>
</xsl:variable>
<xsl:element name="{$element-name}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:for-each>
</xsl:copy>
</xsl:template>
http://xsltransform.hikmatu.com/pPqsHSV
但是,简单地创建一个具有属性中位置的同名元素可能更有意义:
<xsl:template match="test">
<xsl:copy>
<xsl:for-each select="tokenize(., '\s+')">
<word pos="{position()}">
<xsl:value-of select="."/>
</word>
</xsl:for-each>
</xsl:copy>
</xsl:template>
推荐阅读
- php - 我不明白为什么 session_regenerate_id 对低连接很危险?
- php - mysqli_fetch_all 没有从一个特定的表中检索记录
- php - PHP Doctrine 加载关联对象导致错误
- c - 结构的填充大小
- django - 从 facebook 重定向后的 Social-auth AuthCanceled 错误
- php - 如何停止覆盖数组中的第一个索引
- java - 根据两个优先元素对数组的arraylist进行排序
- arrays - bash:使用额外条件循环文件
- python - 由降维的主成分定义的平面的 Python 方程
- javascript - 如果输入的用户不在自动完成列表中,则添加用户