xml - 使用 XSL 转换标签序列

标签 xml xslt if-statement foreach

我对使用 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/

相关文章:

java - 使用java和Xpath获取xml的所有属性

xslt - xsl 引用外部 xsl 文件

python - 嵌套的 if 语句、干净的代码和 Pythonic,带有 Controller /键盘输入

xml - 如何从 XML 文件中的特定节点获取值?

python - XML 到 csv(类似)格式

javascript - 如何让 React.js 输出有效的 xml 而不是 html?

ios - 如何查看使用 valueForKey 创建的 NSArray 是否为空

java - 我可以自定义 Android searchable.xml 布局吗?

xml - 将相同标签、不同命名空间视为相同

language-agnostic - 所有编程语言都有 bool 短路求值吗?