2017-10-27 10 views
1

XSLTを使用してさまざまなXMLファイルを処理しています。あるXMLでは、ラップされたJSONリストが見つかりました:XSLT 3.0 XMLでラップされたJSON配列を繰り返し処理する

<list><![CDATA[[ 
    { 
    "title": "Title 1", 
    "value": "Value 1", 
    "order": 1 
    }, 
    { 
    "title": "Title 2", 
    "value": "Value 2", 
    "order": 2 
    } 
]]]> 
</list> 

私の問題は、リストを反復処理する必要があることです。たとえば:

<xsl:variable name="listVar"> 
    <!-- do something with list --> 
</xsl:variable> 
<xsl:for-each select="$listVar"> 
    <!-- do something with objects in list e.g. --> 
    <xsl:value-of select="title"/> 
    <xsl:value-of select="value"/> 
</xsl:for-each> 

はどのようにXSLTでこれを行うには?私はXSLT 3.0とSaxonエンジン、バージョン9.8を使用しています。

考慮ソリューション:

1. 使用parse-json機能:

しかし、その後、私は理由XPathExceptionの結果を反復処理することができません:「コンテキスト項目の必須項目タイプの子軸があるためnode();指定された値(。)にアイテム型の配列(function(*)) "または"マップはアトム化できません "。私はマップのように考慮する必要があるかもしれない 関数があることがわかりました:get、map:entry、しかし私はこれまでのところ私のケースでは使用できませんでした。

2. Addidiotnal上記1の前変換:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       version="3.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="no"/> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="list"> 
     <list> 
      <xsl:copy-of select="json-to-xml(.)"/> 
     </list> 
    </xsl:template> 
</xsl:stylesheet> 

そして:

<xsl:variable name="listVar" select="list/array/map"/> 

をしかし、それは動作しません - おそらく追加の名前空間へ

<list> 
    <array xmlns="http://www.w3.org/2005/xpath-functions"> 
     <map> 
... 
+0

XMLパーサーとJSONパーサーの両方を使用する必要があります。 –

+0

また、XSLT 3.0に移行している場合、 'を宣言することで、最初のテンプレートで使いたいと思われるアイデンティティ変換をよりコンパクトに表現できます。 '。 –

答えて

1

parse-jsonと解析されたJSON構造体では、 XSLT/XPathの側mapsarrayと個々の配列項目を処理する最も簡単な方法は、?*lookup operatorである、あなたはfor-each、あるいはapply-templatesを使用することができます。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:math="http://www.w3.org/2005/xpath-functions/math" 
    exclude-result-prefixes="xs math" 
    version="3.0"> 

    <xsl:template match="list"> 
     <xsl:apply-templates select="parse-json(.)?*"/> 
    </xsl:template> 

    <xsl:template match=".[. instance of map(xs:string, item())]"> 
     <xsl:value-of select="?title, ?value"/> 
    </xsl:template> 
</xsl:stylesheet> 

再びすることができますマップの値にアクセスします上記のように?fooを使用してください。

json-to-xmlによって返されたXMLの操作については、XPath関数の名前空間内の要素を返します。名前空間内の他の要素と同様に、XPath関数の名前空間を選択します。そのネームスペースの要素を処理するセクションの場合はxpath-default-namespace、または名前空間のワイルドカードを使用できます。 *:array/*:map

関連する問題