2

我正在使用 xslt 编写一个 xml-to-json 转换器。我转换

<raw>
    <id>0</id>
    <type>label</type>
    <title>Test</title>
    <uri>...</uri>
</raw>

{ "id" = "0", "type"="label", "title" = "Test", "uri" = "..." }

对 tag 的子节点进行<xsl:for-each>迭代<raw>,并用 . 添加逗号<xsl:if test="following-sibling::*">, </xsl:if>

但是,如果我想更改上面的 xml 以使用属性而不是子节点:

<raw id="0" type="label" title="Test" uri="..." />

测试失败并且following-sibling::*没有添加逗号。是否有等效following-sibling::*于属性的方法?如果没有,是否可以在这里做我想做的事情?

4

2 回答 2

4

对这两种情况都使用此 XPath:

<xsl:if test="position() != last()">
于 2012-11-07T07:33:29.433 回答
2

轴可能是一项昂贵的following-sibling操作(取决于我们谈论的属性数量)。这是一个相当简化的解决方案,可以完成您的要求(并且在没有following-sibling或任何其他复杂轴的情况下这样做)。

当这个 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output omit-xml-declaration="yes" indent="no" method="text" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <xsl:text>{ </xsl:text>
      <xsl:apply-templates select="raw/@*" />
    <xsl:text> }</xsl:text>
  </xsl:template>

  <xsl:template match="@*">
    <xsl:if test="position() &gt; 1">, </xsl:if>
    <xsl:value-of
      select="concat('&quot;', name(), '&quot; = &quot;', ., '&quot;')" />
  </xsl:template>

</xsl:stylesheet>

...针对您提供的 XML 运行:

<raw id="0" type="label" title="Test" uri="..."/>

...产生了预期的结果:

{ "id" = "0", "type"="label", "title" = "Test", "uri" = "..." }
于 2012-11-07T07:39:36.010 回答