複数のソースによって生成された XML の一部を変換しようとしています。テキストを value-of select ステートメントに直接入力すると、意図したとおりに機能します。しかし、変数を使用しようとするとすぐに機能しなくなります。
xsl:for-each ステートメントで変数を使用すると、それも正常に機能します。これは正常に動作する XSL です
<xsl:variable name="crm_acc" select="account" />
<xsl:variable name="nav_acc" select="kontakt" />
<xsl:variable name="crm_fname" select="firstname" />
<xsl:variable name="nav_fname" select="fname" />
<TreeView>
<xsl:for-each select="$crm_acc | $nav_acc">
<TreeViewItem Header="Item">
<TreeViewItem Header="Firstname:" >
<xsl:value-of select="firstname | fname" />
</TreeViewItem>
</TreeViewItem>
</xsl:for-each>
</TreeView>
しかし、xsl:value-of select 内で変数を使用すると、次のコード ブロックで指定されているように機能しません。「firstname」、「firstname | fname」で1つの変数のみを使用したり、テキストを連結(...)しようとしたりするなど、多くの組み合わせを試しました...
<TreeView>
<xsl:for-each select="$crm_acc | $nav_acc">
<TreeViewItem Header="Item">
<TreeViewItem Header="Firstname:" >
<xsl:value-of select="$crm_fname | $nav_fname" />
</TreeViewItem>
</TreeViewItem>
</xsl:for-each>
</TreeView>
入力 XML:
<?xml version='1.0'?>
<root>
<account system="CRM">
<firstname>test1</firstname>
</account>
<account system="CRM">
<firstname>test2</firstname>
</account>
<kontakt system="NAV">
<erstername>nav1</erstername>
</kontakt>
</root>
変数に「account/firstname」を指定したため、結果が得られたのは1回だけです。しかし、この方法では、すべての for-each 反復でのみ最初の要素の値を常に取得しました。変数を指定するときにコンテキストが失われるようです (プロセッサは現在「アカウント」エンティティ内にあり、「ファーストネーム」をサブノードとして選択する必要があります)。
XSLT 1.0 から 2.0 への select ステートメントの値で何かが変更されたことを読みましたが、違いが何であるかを完全には理解していません (私は XSLT にかなり慣れていません)。
XSL を機能させるには、どのように XSL を指定する必要がありますか?
更新: コード ブロック 1 のように期待される出力
<?xml version="1.0" encoding="UTF-8"?>
<TabItem xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Header="Xaml Accounts Tab">
<TreeView>
<TreeViewItem Header="CRM">
<TreeViewItem Header="Firstname:">test1</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="CRM">
<TreeViewItem Header="Firstname:">test2</TreeViewItem>
</TreeViewItem>
<TreeViewItem Header="NAV">
<TreeViewItem Header="Firstname:">nav1</TreeViewItem>
</TreeViewItem>
</TreeView>
</TabItem>
編集:私が言及すべきだったのは、これらのテンプレートは変更される/変更される可能性があるため、すべての「変数」が1か所にあると簡単になるということです。ターゲットの名前が「連絡先」ではなく、別のものである可能性があり、ドキュメント全体でそれを変更すると、エラーが発生しやすく冗長になります。また、これらの変数は、XmlReader によって読み取られる別のプロセスで使用されます。構成の煩わしさと冗長性をできるだけ低く保つようにしています。