我对使用 XSL 有点陌生.我正在尝试使用 XSL 将一个 XML 文件转换为另一个具有不同结构的 XML 文件。 XML 的 input 部分如下所示:
<tag>
<Keyword>Event: Some Text</Keyword>
<Keyword>Group: Some Text</Keyword>
<Keyword>Other: Some Text</Keyword>
</tag>
我希望所需的输出是:
<tag>
<event> Some Text </event>
<group> Some Text </group>
<other> Some Text </other>
</tag>
我的当前 XSL 文件:
<xsl:for-each select="tag">
<xsl:if test="starts-with(Keyword, 'Event: ')">
<event>
<xsl:value-of select="substring-after(Keyword, 'Event: ')"/>
</event>
</xsl:if>
<xsl:if test="starts-with(Keyword, 'Group: ')">
<group>
<xsl:value-of select="substring-after(Keyword, 'Group: ')"/>
</group>
</xsl:if>
<xsl:if test="starts-with(Keyword, 'Other: ')">
<other>
<xsl:value-of select="substring-after(Keyword, 'Other: ')"/>
</other>
</xsl:if>
</xsl:for-each>
当前输出只显示事件节点,不显示剩余节点:
<tag>
<event> Some Text </event>
</tag>
我尝试将 XSL 中的“组”部分与“事件”部分切换,但是可能由于输入 XML 中关键字节点的顺序,所有子节点都未显示。那么如何读取所有关键字节点并将它们转换为各自的新节点进行显示呢?
最佳答案
@Pierre:我正确理解最初的问题和您的解决方案;) 您构建 XML 元素的方式恕我直言,有点hackly。 XSLT 具有用于动态构建 xml 元素的特殊集合。所以你的模板 match="Keyword" 可以是这样的
<xsl:template match="Keyword">
<xsl:variable name="tag" select="normalize-space(substring-before(.,':'))"/>
<xsl:element name="{$tag}">
<xsl:value-of select="normalize-space(substring-after(.,':'))"/>
</xsl:element>
</xsl:template>
因此,如果需要,您可以选择轻松地向输出 XML 元素添加属性,而不必为禁用输出转义等而烦恼。
关于xml - 使用 XSL 转换标签序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2101228/