我正在尝试使用 XSL 转换此 XML:
<book><title>This is a <b>great</b> book</title></book>
进入这个 XML:
<book>This is a <bold>great</bold> book</book>
使用这个 xsl:
<xsl:for-each select="book/title/*">
<xsl:choose>
<xsl:when test="name() = 'b'">
<bold>
<xsl:value-of select="text()"/>
</bold>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="text()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
但我的输出看起来像这样:
<book><bold>great</bold></bold>
谁能解释为什么 <title>
的根文本迷路了吗?我认为我的 for-each select 语句可能需要修改,但我不知道应该修改什么。
请记住,我不能使用 <xsl:template match>
因为我的样式表很复杂。
谢谢!
最佳答案
这个 XPath 表达式:
book/title/*
表示“book/title
的所有子元素”。在你的情况下,book/title
有 3 个子节点:
- 文本节点:
This is a
- 元素节点:
<b>...</b>
- 文本节点:
book
如您所见,只有其中一个是元素,并被选中。如果要获取所有子节点,包括文本和元素,请使用:
book/title/node()
如果你想单独获取文本节点,使用这个:
book/title/text()
关于xml - 使用 xsl 方法 for-each 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1821109/