2

私はバインディング用のようなxmlファイルを持っています:

<?xml version="1.0" encoding="utf-16"?>
<MyCustomer>
  <Customers>
    <CutomerCode>C001</CutomerCode>
    <CustomerName>Shahbaz</CustomerName>
    <City>Karachi</City>
    <Country>Pakistan</Country>
  </Customers>
  <Customers>
    <CutomerCode>C002</CutomerCode>
    <CustomerName>Imran</CustomerName>
    <City>Lahore</City>
    <Country>Pakistan</Country>
  </Customers>
</MyCustomer>

XSLT を適用しています。

<xsl:stylesheet
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 version="1.0">

 <xsl:strip-space elements="*"/>
 <xsl:output indent="yes"/>
 <xsl:template match="MyCustomer">
   <xsl:copy>
     <Customers>
       <xsl:apply-templates select="Customers/*"/>
     </Customers>
   </xsl:copy>
 </xsl:template>
 <xsl:template match="Customers/*">
   <xsl:copy>
       <xsl:value-of select="."/>
   </xsl:copy>
 </xsl:template>
 <xsl:template match="Customers/City">
      <xsl:element name="Address">
         <xsl:element name="City">
       <xsl:value-of select="." />
        </xsl:element>
    </xsl:element>
 </xsl:template>
 <xsl:template match="Customers/Country">
      <xsl:element name="Address">
         <xsl:element name="Country">
       <xsl:value-of select="." />
        </xsl:element>
    </xsl:element>
 </xsl:template>
</xsl:stylesheet>

そして、このXSLTは私に結果を与えています:

<?xml version="1.0" encoding="utf-16"?>
<MyCustomer>
  <Customers>
    <CutomerCode>C001</CutomerCode>
    <CustomerName>Shahbaz</CustomerName>
    <Address>
      <City>Karachi</City>
    </Address>
    <Address>
      <Couontry>Pakistan</Couontry>
    </Address>
    <CutomerCode>C002</CutomerCode>
    <CustomerName>Imran</CustomerName>
    <Address>
      <City>Lahore</City>
    </Address>
    <Address>
      <Country>Pakistan</Country>
    </Address>
  </Customers>
</MyCustomer>

私はこのような変換が必要でしたが:

<?xml version="1.0" encoding="utf-16"?>
<MyCustomer>
  <Customers>
    <CutomerCode>C001</CutomerCode>
    <CustomerName>Shahbaz</CustomerName>
    <Address>
      <City>Karachi</City>
      <Country>Pakistan</Country>
    </Address>
    <CutomerCode>C002</CutomerCode>
    <CustomerName>Imran</CustomerName>
    <Address>
      <City>Lahore</City>
      <Couontry>Pakistan</Couontry>
    </Address>
  </Customers>
</MyCustomer>

正しく変換したいのですが、助けてください。正しい xslt メソッドが欲しいのです。助けてください。

4

1 に答える 1

1

個人をアンラップしてもCustomersよろしいですか?

次の 2 つのテンプレートが原因で、スタイルシートが機能していないようです。

<xsl:template match="Customers/City">
      <xsl:element name="Address">
         <xsl:element name="City">
       <xsl:value-of select="." />
        </xsl:element>
    </xsl:element>
 </xsl:template>
 <xsl:template match="Customers/Country">
      <xsl:element name="Address">
         <xsl:element name="Country">
       <xsl:value-of select="." />
        </xsl:element>
    </xsl:element>
 </xsl:template>

これらはあなたに2つの異なるAddress要素を与えています.

次のようなことができます:

<xsl:template match="Customers/City">
    <Address>
        <City>
            <xsl:value-of select="." />
        </City>
        <Country>
            <xsl:value-of select="following-sibling::Country"/>
        </Country>
    </Address>
</xsl:template>
<xsl:template match="Customers/Country"/>

これは同様の XSLT 1.0 スタイルシートで、希望する結果が得られ、私の意見では少しすっきりしています。

XSLT1.0

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

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

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

    <xsl:template match="Customers">
        <xsl:apply-templates select="node()[not(self::City) and not(self::Country)]"/>
        <Address>
            <xsl:apply-templates select="City|Country"/>
        </Address>
    </xsl:template>

</xsl:stylesheet>

XML 出力

<MyCustomer>
   <Customers>
      <CutomerCode>C001</CutomerCode>
      <CustomerName>Shahbaz</CustomerName>
      <Address>
         <City>Karachi</City>
         <Country>Pakistan</Country>
      </Address>
      <CutomerCode>C002</CutomerCode>
      <CustomerName>Imran</CustomerName>
      <Address>
         <City>Lahore</City>
         <Country>Pakistan</Country>
      </Address>
   </Customers>
</MyCustomer>
于 2013-02-08T06:48:13.970 に答える