1

私は XSLT の第一人者ではなく、同様の例をオンラインで見つけることができませんでした。複数のファイルからアプリのリストを検索に使用できる単一の変数にまとめたいと思います。

基本的に、元の変数宣言を新しいものに置き換えると、XSLT はそれを気に入りません。変数の内容をファイルに出力しましたが、それらは XML 要素のフォーマットが同じであるため、変数にリンクされたメタデータのどこかに失敗しているに違いありません。

すべてのファイルの XML 要素形式

<include-application name="appname" type="blah"/>

元の変数

<xsl:variable name="applications" select="board/packaging/*/include-application"/>

新しい変数定義

<xsl:variable name="applications">
    <xsl:copy-of select="board/packaging/*/include-application"/>
    <xsl:for-each select="board/packaging/applications/include">
        <xsl:variable name="appset" as="xs:string" select="@name"/>
        <xsl:variable name="includefile" as="xs:string" select="concat('../share/appsets/', $appset, '.xml')"/>
        <xsl:copy-of select="document($includefile)/applications/include-application"/>
    </xsl:for-each>
</xsl:variable>

次に、要素にアクセスして何かを選択しようとすると、新しい変数定義で失敗します (39 行目は下のブロックの最初の行です)。

<xsl:variable name="type" select="$applications[@name = $appname]/@type"/>
<xsl:variable name="appid" select="$app-names/application-package-name[@name = $appname]/appid[@type = $type]/@value"/>

XPath エラー: 無効な型のランタイム エラー: ファイル xslt/blah.xslt 行 39 要素 variable 変数 'type' の式を評価できませんでした。

ありがとう

デビッド

4

3 に答える 3

0

上記の回答を組み合わせて使用​​し、より深く調べて、exslt 拡張機能を使用してノード セットに変換しましたが、現在は問題なく動作しています。

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common">
...
<xsl:variable name="applications" as="element(include-application)*">
...
<xsl:variable name="type" select="exslt:node-set($applications)/include-application[@name = $appname]/@type"/>
于 2013-10-03T16:31:24.900 に答える