-1

XSLT の経験はあまりありません。以下の xml の正しい XSL 変換を準備するために、あなたの助けが必要です。私は次のようなXMLを持っています

<message>
<requisition>
    <data-values>
        <data-value multi-valued="false">
            <name>Test_Grid-1.Name</name>
            <value>1</value>
        </data-value>
        <data-value multi-valued="false">
            <name>Test_Grid-1.SupportType</name> 
            <value>Monthly,Quarterly</value>
        </data-value>
        <data-value multi-valued="false">
            <name>Test_Grid-1.Status</name>
            <value>New</value>
        </data-value>
        <data-value multi-valued="false">
            <name>Test_Grid-2.Name</name>
            <value>2</value>
        </data-value>
        <data-value multi-valued="false">
            <name>Test_Grid-2.SupportType</name> 
            <value>Monthly</value>
        </data-value>
        <data-value multi-valued="false">
            <name>Test_Grid-2.Status</name>
            <value>Existing</value>
        </data-value>
    </data-values>
</requisition>
<agent-parameter multi-valued="false">
    <name>ActionType</name>
    <value>New</value>
</agent-parameter>
<agent-parameter multi-valued="false">
    <name>Dictionary</name>
    <value>Test_Grid</value>
</agent-parameter>
<agent-parameter multi-valued="false">
    <name>ActionName</name>
    <value>SupportData</value>
</agent-parameter>
</message>

次のような XML を準備します。

<ext:message>
<ext:record>
    <ext:name>SupportData</ext:name>
    <ext:rowData>
        <ext:rowAttribute name="Name">1</ext:rowAttribute>
        <ext:rowAttribute name="SupportType">Monthly,Quarterly</ext:rowAttribute>
        <ext:rowAttribute name="Status">New</ext:rowAttribute>
    </ext:rowData>
</ext:record>
<ext:record>
    <ext:name>SupportData</ext:name>
    <ext:rowData>
        <ext:rowAttribute name="Name">2</ext:rowAttribute>
        <ext:rowAttribute name="SupportType">Monthly</ext:rowAttribute>
        <ext:rowAttribute name="Status">Existing</ext:rowAttribute>
    </ext:rowData>
</ext:record>

このための XSL 変換について教えてください。よろしくお願いいたします。

4

2 に答える 2

0

これは、グループ化の問題と見なすことができます。連続した要素がありますが、それらを名前要素 (または、ここでのロジックであると想定しているピリオドの前の名前要素の一部) でグループ化したいと考えています。XSLT 1.0 では通常、これを行うためにMuenchian Groupingと呼ばれる手法を使用します。

まず、データ値要素を関連する名前で「グループ化」するキーを定義します。

<xsl:key name="record" match="data-value" use="substring-before(name, '.')" />

したがって、「Test_Grid-2」などの特定の名前の場合、キーにはレコードに必要なすべての要素が含まれます。

レコードの出力を開始するには、最初にすべてのデータ値要素を確認する必要がありますが、指定された「名前」のキーで最初に出現する要素のみを選択します。要素の比較は「generate-id()」メソッドで行われるため、式は次のようになります。

<xsl:apply-templates 
     select="requisition/data-values/data-value
     [generate-id() = 
        generate-id(key('record', substring-before(name, '.'))[1])]" mode="record" />

(ここでのモードは、最終的な XSLT がdata-valueに一致する 2 つのテンプレートを持ち、それらを区別するためです)。

次に、個別のデータ値要素に一致するテンプレート内で、次のようにレコードのすべての要素を取得します

<xsl:apply-templates select="key('record', substring-before(name, '.'))" />

注意すべきことの1つは、予想される出力が名前空間プレフィックス「ext」を使用していることですが、プレフィックスの宣言を示していません。(おそらく、例を単純化しただけだからです)、実際には出力が次のように始まると思います:

<ext:message xmlns:ext="http://mylovelynamespace.com">

とにかく、このXSLTを試してください

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="ext">
   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="record" match="data-value" use="substring-before(name, '.')" />

   <xsl:template match="message">
      <ext:message>
         <xsl:apply-templates select="requisition/data-values/data-value[generate-id() = generate-id(key('record', substring-before(name, '.'))[1])]" mode="record" />
      </ext:message>
   </xsl:template>

   <xsl:template match="data-value" mode="record">
      <ext:record>
         <ext:name>SupportData</ext:name>
         <xsl:apply-templates select="key('record', substring-before(name, '.'))" />
      </ext:record>
   </xsl:template>

   <xsl:template match="data-value">
      <ext:rowAttribute name="{substring-after(name, '.')}"><xsl:value-of select="value" /></ext:rowAttribute>
   </xsl:template>
</xsl:stylesheet>

XSLT 2.0 では、xsl:for-each-groupコンストラクトを使用してグループ化を簡素化できました。

于 2013-09-21T08:36:01.333 に答える
0

何かのようなもの

<xsl:for-each select="data-value[position() mod 3 = 1]">
<ext:Record>
  <ext:name>...</ext:name>
  <ext:rowData>
    <ext:rowAttribute name="Name"><xsl:value-of select="substring(substring-after(name, 'Test-Grid_'), 1, 1)"/></ext:rowAttribute>
    <ext:rowAttribute name="SupportType"><xsl:value-of select="following-sibling[1]/value"/></ext:rowAttribute>
    <ext:rowAttribute name="Status"><xsl:value-of select="following-sibling[2]/value"/></ext:rowAttribute>
   </ext:rowData>
 </ext:Record>
</xsl:for-each>
于 2013-09-21T08:25:54.280 に答える