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>
...
XMLパーサーとJSONパーサーの両方を使用する必要があります。 –
また、XSLT 3.0に移行している場合、 ' を宣言することで、最初のテンプレートで使いたいと思われるアイデンティティ変換をよりコンパクトに表現できます。 '。 –