1

私は xslt を初めて使用するので、これが素朴な質問である場合はご容赦ください。ソース ドキュメント内の部門名を含む要素の値を、その部門名のバリエーションを子としてリストする別のドキュメント内の子要素の値と一致させ、その子の親を現在のノードとして設定して値を取得する必要があります。他の子供たちの。

ソース ドキュメントの例を次に示します。

<sourceRoot>
 <sourceElement>foo</sourceElement>
</sourceRoot>

リスト ドキュメントの例を次に示します。

<departments>
 <department>
  <child1>bar</child1>
  <child2>bar2</child2>
  <child3>bar3</child3>
 </department>
 <department>
  <child1>baz</child1>
  <child2>baz2</child2>
  <child3>baz3</child3>
 </department>
 <department>
  <child1>foo</child1>
  <child2>foo2</child2>
  <child3>foo3</child3>
 </department>
</departments>
etc.

これは望ましい結果です:

<child2value>foo2</child2value>
<child3value>foo3</child3value>

私はこのxslを使用しようとしました:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    >

    <xsl:output method="xml" indent="yes" omit-xml-declaration="no" encoding="UTF-8"/>
    <xsl:preserve-space elements="text"/>

    <xsl:variable name="departments" select="document('dept.xml')/departments"/>  

    <xsl:template match="/">          
        <xsl:variable name="sourceElement" select="sourceRoot/sourceElement"/>                   
        <xsl:variable name="child1" select="$departments/department/child1"/> 
        <xsl:variable name="child2" select="$departments/department/child2"/>
        <xsl:variable name="child3" select="$departments/department/child3"/>

        <xsl:choose>    
        <xsl:when test="$sourceElement=$child1">               
            <child2value>
                <xsl:value-of select="$departments/department[.]/child2"/>
            </child2value>
            <child3value>
                <xsl:value-of select="$departments/department[.]/child3"/>                
            </child3value>
        </xsl:when>
        <xsl:otherwise/>
    </xsl:choose>   
    </xsl:template>   
</xsl:stylesheet>

ただし、すべてのdepartmentノードの子の値を返します。

<child2value>bar2 baz2 foo2</child2value>
<child3value>bar3 baz3 foo3</child3value>

ここでは、ノードを現在のノードに設定する方法に関する重要な概念が欠けていることを知っています。この初心者のためのアドバイスをありがとう。

4

2 に答える 2

0

次の変換で示すように、単一の XPath 式で必要なものを選択できます。

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

 <xsl:template match="sourceElement">
     <xsl:copy-of select=
     "document('file:///c:/temp/delete/dept.xml')
               /*/*[child1 = current()]
                     /*[not(self::child1)]
     "/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<sourceRoot>
 <sourceElement>foo</sourceElement>
</sourceRoot>

2 番目に提供された XML ドキュメントは、次のローカル ファイル システムにありますc:\temp\delete\dept.xml

<departments>
 <department>
  <child1>bar</child1>
  <child2>bar2</child2>
  <child3>bar3</child3>
 </department>
 <department>
  <child1>baz</child1>
  <child2>baz2</child2>
  <child3>baz3</child3>
 </department>
 <department>
  <child1>foo</child1>
  <child2>foo2</child2>
  <child3>foo3</child3>
 </department>
</departments>

必要な正しい結果が生成されます。

<child2>foo2</child2>
<child3>foo3</child3>

更新

上で選択した要素の名前を変更したい場合、これは非常に簡単です:

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

 <xsl:template match="sourceElement">
     <xsl:apply-templates select=
     "document('file:///c:/temp/delete/dept.xml')
               /*/*[child1 = current()]
                     /*[not(self::child1)]
     "/>
 </xsl:template>

 <xsl:template match="*[starts-with(name(), 'child')]">
  <xsl:element name="{name()}value"><xsl:value-of select="."/></xsl:element>
 </xsl:template>
</xsl:stylesheet>

生成します:

<child2value>foo2</child2value>
<child3value>foo3</child3value>
于 2013-03-31T16:29:03.400 に答える