【问题标题】:Creating an xml container using xmlst使用 xmlst 创建 xml 容器
【发布时间】:2012-06-29 08:40:15
【问题描述】:

我正在尝试规范化一段 xml。我在与ProductID 相关的部分遇到问题。我正在尝试通过我的<xsl:for-each select="ProductID"> 为它创建一个容器<products><productid>xyz</productid></products> 似乎没有工作。谁能指出我正确的方向?

<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>

【问题讨论】:

    标签: xml ssis xls xlsx xlsm


    【解决方案1】:

    您的 XML 不正确(元素打开的是 SartDate 而不是 StartDate)。 在您的尝试中,在我看来您忘记了 XML 区分大小写。如果您想在输出中包含 PromotionID,那么如果您将promotion_id 作为XSLT 中的元素名称,则不会发生这种情况。

    无论如何。

    这是一个 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-12
      • 2019-02-20
      • 2016-01-06
      相关资源
      最近更新 更多