2

xsltを使用してxmlからjsonへのコンバーターを作成しています。変換します

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

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

<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 に答える