0

XMLの一部を正規化しようとしています。に関するセクションで問題が発生していProductIDます。私はそれのためのコンテナを作成しようとしていますが、動作し<products><productid>xyz</productid></products><xsl:for-each select="ProductID"> いないようです。誰かが私を正しい方向に向けることができますか?

<Batch>
  <Promotion>
    <PromotionID>000873</PromotionID>
    <Description country="GB" language="en" variant="">*P* Free Clotted Cream      Scone</Description>
    <MultibuyGroup>
        <RewardType>1</RewardType>
        <RewardValue>0.0</RewardValue>
        <RewardValue currency="GBP">1.0</RewardValue>
        <ProductID>1300003536</ProductID>
        <ProductID>1300000746</ProductID>
        <ProductID>1300002393</ProductID>
        <ProductID>1300002648</ProductID>
        <ProductID>1300002899</ProductID>
        <ProductID>1300003535</ProductID>
        <ProductID>1300003222</ProductID>
    </MultibuyGroup>
    <MultibuyGroup>
        <RewardType>0</RewardType><RewardValue>0.0</RewardValue>
        <RewardValue currency="GBP">0.0</RewardValue>
        <ProductID>1570000102</ProductID>
    </MultibuyGroup>
    <Timetable>
      <SartDate>2008-02-02T00:00:00+00:00</StartDate>
      <FinishDate>2008-02-03T23:59:59+00:00</FinishDate>
    </Timetable>
 </Promotion>
</Batch>

私はそれが見えるようにしようとしています。

<Batch>
  <Promotion>
    <PromotionID>000873</PromotionID>
    <badge_id>tbc</badge_id>
    <loyaltyaccountholdersonly>TBC</loyaltyaccountholdersonly>
    <locations>TBC</locations>
    <Description country="GB" language="en" variant="">*P* Free Clotted Cream      Scone</Description>
    <MultibuyGroup>
        <RewardType>1</RewardType>
        <RewardValue>0.0</RewardValue>
        <RewardValue currency="GBP">1.0</RewardValue>
        <products>
          <ProductID>1300003536</ProductID>
          <ProductID>1300000746</ProductID>
          <ProductID>1300002393</ProductID>
          <ProductID>1300002648</ProductID>
          <ProductID>1300002899</ProductID>
          <ProductID>1300003535</ProductID>
          <ProductID>1300003222</ProductID>
        </products>
    </MultibuyGroup>
    <MultibuyGroup>
        <RewardType>0</RewardType><RewardValue>0.0</RewardValue>
        <RewardValue currency="GBP">0.0</RewardValue>
        <ProductID>1570000102</ProductID>
    </MultibuyGroup>
    <Timetable>
      <SartDate>2008-02-02T00:00:00+00:00</StartDate>
      <FinishDate>2008-02-03T23:59:59+00:00</FinishDate>
    </Timetable>
 </Promotion>
</Batch>

次の XSL を使用する

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">  
<promotions> 
<xsl:for-each select="Batch/Promotion">  
  <promotion>
    <promotion_id><xsl:value-of select="PromotionID"/></promotion_id>    
    <badge_id>TBC</badge_id>
    <loyaltyaccountholdersonly>TBC</loyaltyaccountholdersonly>
    <description><xsl:value-of select="Description[@country = 'GB']"/></description>
    <locations>TBC</locations>
    <xsl:for-each select="MultibuyGroup">
      <multibuygroup>
        <products>
        <xsl:for-each select="ProductID">
          <product_id><xsl:value-of select="ProductID"/></product_id>
        </xsl:for-each>
        </products>
        <rewardtype><xsl:value-of select="RewardType"/></rewardtype> 
        <rewardvalue><xsl:value-of select="RewardValue"/></rewardvalue>
        <rewardthreshold>TBC</rewardthreshold>
        <groupdescription><xsl:value-of select="GroupDescription"/></groupdescription>
      </multibuygroup>
    </xsl:for-each>
    <timetable> 
      <startdate><xsl:value-of select="Timetable/StartDate"/></startdate>
      <expirydate><xsl:value-of select="Timetable/FinishDate"/></expirydate>
    </timetable>
  </promotion>
</xsl:for-each>   
</promotions>
</xsl:template>
</xsl:stylesheet>
4

1 に答える 1

0

XML が正しくありません (StartDate ではなく SartDate を開く要素)。あなたの試みでは、XML では大文字と小文字が区別されることを忘れているようです。出力に PromotionID が必要な場合、XSLT で要素名として Promotion_id を指定すると、それが発生することはありません。

ともかく。

あなたが求めていると私が思うことを行うXSLTは次のとおりです。

  1. 最初に、属性を含むすべての要素を一般的にコピーするよう求めます。
  2. 次に、各 Promotion 要素にいくつかの要素を追加するよう求めます。
  3. 次に、Multibuy については、製品のリストをコピーするよう求められます。
  4. 最後に、ProductID 要素を元の場所に (再び) コピーしないように求めます。

イヴ

<?xml-stylesheet type="text/xsl"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="*">  
    <xsl:copy>
        <xsl:copy-of select="@*" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>
<xsl:template match="Promotion">  
    <xsl:copy>
        <badge_id>tbc</badge_id>
        <loyaltyaccountholdersonly>TBC</loyaltyaccountholdersonly>
        <locations>TBC</locations>
        <xsl:copy-of select="@*" />
        <xsl:apply-templates />
    </xsl:copy>
</xsl:template>
<xsl:template match="MultibuyGroup">  
    <xsl:copy>
        <xsl:copy-of select="@*" />

        <xsl:apply-templates />
        <Products>
            <xsl:for-each select="ProductID">
                <xsl:copy>
                    <xsl:copy-of select="@*" />
                    <xsl:apply-templates />
                </xsl:copy>
            </xsl:for-each>
        </Products>
    </xsl:copy>
</xsl:template>   
<xsl:template match="ProductID"></xsl:template>
</xsl:stylesheet>
于 2012-07-02T11:26:22.823 に答える