1

私はこのようなソースXMLを持っています

<parent>
      <child id="123456">Child Name
      </child>
      <image name="child.jpg">
</parent>

宛先 XML は

<data>
     <person id="123456">
        <name>Child Name</name>
     </person>
     <relation id="123456">
        <filename>child.jpg</filename>
     </relation>
</data>

これを変換するために XSLT を使用しています。問題は、XSLT を使用して宛先 XML の 2 つの異なる場所でソース XML から id (123456) の値を取得する方法です。

4

2 に答える 2

2

短くて簡単な解決策は次のとおりです。

<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="parent">
     <data>
       <xsl:apply-templates/>
     </data>
 </xsl:template>

 <xsl:template match="child">
  <person id="{@id}">
    <name><xsl:value-of select="."/></name>
  </person>
 </xsl:template>

 <xsl:template match="image">
  <relation id="{preceding-sibling::child[1]/@id}">
   <filename><xsl:value-of select="@name"/></filename>
  </relation>
 </xsl:template>
</xsl:stylesheet>

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

<parent>
    <child id="123456">Child Name</child>
    <image name="child.jpg"/>
</parent>

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

<data>
   <person id="123456">
      <name>Child Name</name>
   </person>
   <relation id="123456">
      <filename>child.jpg</filename>
   </relation>
</data>
于 2012-05-14T13:14:52.083 に答える
0

これを試すことができます: XSL:

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

<xsl:template match="/">
    <data>
        <xsl:for-each select="parent">
            <!--variable to store @id-->
            <xsl:variable name="id" select="child/@id"/>
            <!--creating a test comment node()-->
            <xsl:comment>Child having id: <xsl:value-of select="child/@id"/></xsl:comment>
            <xsl:element name="person">
                <xsl:attribute name="id"><xsl:value-of select="$id"/></xsl:attribute>
                <xsl:element name="name">
                    <xsl:value-of select="./child/text()"/>
                </xsl:element>
            </xsl:element>
            <xsl:element name="relation">
                <xsl:attribute name="id">
                    <xsl:value-of select="$id"/>
                </xsl:attribute>
                <xsl:element name="filename">
                    <xsl:value-of select="./image/@name"/>
                </xsl:element>
            </xsl:element>
        </xsl:for-each>
    </data>
</xsl:template>

</xsl:stylesheet>

入力XML(あなたのものですが、整形式にするために少し変更されています)

<?xml version="1.0"?>
<parent>
      <child id="123456">Child Name</child>
      <image name="child.jpg"/>
</parent>

そして結果

<?xml version='1.0' ?>
<data>
  <!--Child having id: 123456-->
  <person id="123456">
    <name>Child Name</name>
  </person>
  <relation id="123456">
    <filename>child.jpg</filename>
  </relation>
</data>
于 2012-05-14T11:07:14.020 に答える