2

XQuery を使用して、応答 XML の要素に属性を追加する必要があります。以下の XML を入力として取り、

<xyz:RootNode xmlns:abc="url1" xmlns:xyz="url2">
  <abc:OtherNodes/>
  <abc:messageHeader att1="val1" att2="val2">
       <abc:childNodes/>  
  </abc:messageHeader>
  <abc:OtherNodes/>
</xyz:RootNode>

newValを持つもう 1 つの属性newAttを追加し、結果を次のように与えるXquery が必要です。

<xyz:RootNode xmlns:abc="url1" xmlns:xyz="url2">
   <abc:OtherNodes/>
   <abc:messageHeader att1="val1" att2="val2" newAtt="newVal">
       <abc:childNodes/>  
  </abc:messageHeader>
  <abc:OtherNodes>
</xyz:RootNode>

メッセージヘッダーの属性の数は毎回変わる可能性があります。したがって、クエリは既存のすべての属性とともに新しい属性を追加し、ドキュメント全体を返す必要があります。

4

2 に答える 2

1

XSLT は、そのようなもののためにそこにあるホイールをいつでも再利用できます。特に、コードのリスクを最小限に抑えたい場合。

eXist は XSL 変換をサポートしています。必要なジョブを実行する XSLT 変換を実行する方法の例を次に示します。

xquery version "3.0";

declare function local:add-attribute($input as node()?, $attributeName as xs:string, $attributeValue as xs:string?) {
    let $xslt := <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template xmlns:abc="url1" match="abc:messageHeader">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:attribute name="{$attributeName}">{$attributeValue}</xsl:attribute>
            <xsl:apply-templates select="node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>
return transform:transform($input, $xslt, ())
};

let $input := <xyz:RootNode xmlns:abc="url1" xmlns:xyz="url2">
  <abc:OtherNodes/>
  <abc:messageHeader att1="val1" att2="val2">
       <abc:childNodes/>  
  </abc:messageHeader>
  <abc:OtherNodes/>
</xyz:RootNode>

return local:add-attribute($input, "hey", "bam")

$parametersXSLT を独自のファイルに取り込みたい場合は、この属性を利用することもできます。物事をさらにテスト可能にし、モジュール化します。

于 2013-10-16T20:35:01.683 に答える