2012-02-29 10 views
2

に応じて、宛先フィールドにソース値の構造をマッピングするためのXSLTを生成します。私は、この形式のXMLのソースリストを持っているソースコンテンツ

<metadata> 
    <metadatum> 
    <description>OnEnter</description> 
    <value>Hello World</id> 
    </metadatum> 
    <metadatum> 
    <description>OnLeave</description> 
    <value>Goodbye World</id> 
    </metadatum> 
</metadata> 

と、このようなターゲット構造:

<friendlyText> 
    <onEnter>[Content Here]</onEnter> 
    <onLeave>[Content Here]</onLeave> 
</friendlyText> 

ですソース '記述'に応じてメタデータ階層の 'value'フィールドを適切なターゲットノードにマップするXSLTを作成することは可能ですか?

私はこれをAltova MapForceでやってみようとしています。これを可能にするインターフェースが必要なように感じます。私はそれを見つけられません。

+0

は【こちらのコンテンツ]かを指定しますか? –

答えて

0

この変換は、別のXML文書にある任意の "標的構造" で動作することができる一般的な解決策である。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my" exclude-result-prefixes="my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:variable name="vUpper" select= 
    "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/> 
<xsl:variable name="vLower" select= 
    "'abcdefghijklmnopqrstuvwxyz'"/> 

<my:target> 
    <friendlyText> 
    <onEnter>[Content Here]</onEnter> 
    <onLeave>[Content Here]</onLeave> 
    </friendlyText> 
</my:target> 

<xsl:variable name="vTarget" select="document('')/*/my:target/*"/> 

<xsl:variable name="vMeta" select="/*/metadatum"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="/"> 
    <xsl:apply-templates select="$vTarget"/> 
</xsl:template> 

<xsl:template match="friendlyText/*/text()"> 
    <xsl:value-of select= 
    "$vMeta[translate(description, $vLower, $vUpper) 
     = 
      translate(name(current()/..), $vLower, $vUpper) 
      ]/value"/> 
</xsl:template> 
</xsl:stylesheet> 

提供されたXML文書に適用されます(整形式に修正されています):

<friendlyText xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my"> 
    <onEnter>Hello World</onEnter> 
    <onLeave>Goodbye World</onLeave> 
</friendlyText> 

注意ください

<metadata> 
    <metadatum> 
     <description>OnEnter</description> 
     <value>Hello World</value> 
    </metadatum> 
    <metadatum> 
     <description>OnLeave</description> 
     <value>Goodbye World</value> 
    </metadatum> 
</metadata> 

は指名手配、正しい結果を生成便宜上、 "ターゲット構造は" インラインここにあります。実際の世界では、「ターゲット構造」を別のファイルに保存し、document()関数を使用してロードする方がよいでしょう。のみ行:

<xsl:variable name="vTarget" select="document('')/*/my:target/*"/> 

に変更する必要があります:

<xsl:variable name="vTarget" select="document('someFileUrl')/*"/> 
1
<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > 
    <xsl:output method="xml" indent="yes"/> 

    <xsl:template match="metadata"> 
    <friendlyText> 
     <xsl:apply-templates select="metadatum"/> 
    </friendlyText> 
    </xsl:template> 

    <xsl:template match="metadatum"> 
    <xsl:element name="{description}"> 
     <xsl:value-of select="value"/> 
    </xsl:element> 
    </xsl:template> 

</xsl:stylesheet> 

出力:

<?xml version="1.0" encoding="utf-8"?> 
<friendlyText> 
    <OnEnter>Hello World</OnEnter> 
    <OnLeave>Goodbye World</OnLeave> 
</friendlyText> 
関連する問題