1

我有以下 XML 文件,其中每个 SALES 标记中都有重复的 DateSold 标记。我需要将它们替换为 DateSold 和 TimeSold。或者将日期和时间部分合并为一个标签。

源 XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <SALES>
      <InvoiceID>A13A30000011</InvoiceID>
      <LineID>1</LineID>
      <UPC>058030020130</UPC>
      <Desc>PS WQ VIT E 200IU 100'S</Desc>
      <DateSold>2013-10-30</DateSold>
      <DateSold>10:02:42</DateSold>
      <QTY>000001</QTY>
      <UnitRetail>000006.99</UnitRetail>
      <UnitCost>000003.37</UnitCost>
   </SALES>
   <SALES>
      <InvoiceID>A13A30000021</InvoiceID>
      <LineID>2</LineID>
      <UPC>063601699165</UPC>
      <Desc>GENTEAL GEL DROPS 15ML</Desc>
      <DateSold>2013-10-30</DateSold>
      <DateSold>10:03:15</DateSold>
      <QTY>000001</QTY>
      <UnitRetail>000010.99</UnitRetail>
      <UnitCost>000007.44</UnitCost>
   </SALES>
</root>

输出将是:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <SALES>
      <InvoiceID>A13A30000011</InvoiceID>
      <LineID>1</LineID>
      <UPC>058030020130</UPC>
      <Desc>PS WQ VIT E 200IU 100'S</Desc>
      <DateSold>2013-10-30</DateSold>
      <TimeSold>10:02:42</TimeSold>
      <QTY>000001</QTY>
      <UnitRetail>000006.99</UnitRetail>
      <UnitCost>000003.37</UnitCost>
   </SALES>
   <SALES>
      <InvoiceID>A13A30000021</InvoiceID>
      <LineID>2</LineID>
      <UPC>063601699165</UPC>
      <Desc>GENTEAL GEL DROPS 15ML</Desc>
      <DateSold>2013-10-30</DateSold>
      <TimeSold>10:03:15</TimeSold>
      <QTY>000001</QTY>
      <UnitRetail>000010.99</UnitRetail>
      <UnitCost>000007.44</UnitCost>
   </SALES>
</root>

可以合并为

    <SALES>
    <InvoiceID>A13A30000021</InvoiceID>
    <LineID>2</LineID>
    <UPC>063601699165</UPC>
    <Desc>GENTEAL GEL DROPS 15ML</Desc>
    <DateSold>2013-10-30 10:03:15</TimeSold>
    <QTY>000001</QTY>
    <UnitRetail>000010.99</UnitRetail>
    <UnitCost>000007.44</UnitCost>      
</SALES>
4

2 回答 2

1

我终于找到了解决方案。以下 xslt 将每个 Sales 标记中的第二个 Datesold 标记替换为 TimeSold。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>
<xsl:template match="SALES/DateSold[2]">
    <TimeSold>
        <xsl:apply-templates select="@*|node()" />
    </TimeSold>
</xsl:template>
</xsl:stylesheet>

我得到的最终结果是:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <SALES>
    <InvoiceID>A13A30000011</InvoiceID>
    <LineID>1</LineID>
    <UPC>058030020130</UPC>
    <Desc>PS WQ VIT E 200IU 100'S</Desc>
    <DateSold>2013-10-30</DateSold>
    <TimeSold>10:02:42</TimeSold>
    <QTY>000001</QTY>
    <UnitRetail>000006.99</UnitRetail>
    <UnitCost>000003.37</UnitCost>
  </SALES>
  <SALES>
    <InvoiceID>A13A30000021</InvoiceID>
    <LineID>2</LineID>
    <UPC>063601699165</UPC>
    <Desc>GENTEAL GEL DROPS 15ML</Desc>
    <DateSold>2013-10-30</DateSold>
    <TimeSold>10:03:15</TimeSold>
    <QTY>000001</QTY>
    <UnitRetail>000010.99</UnitRetail>
    <UnitCost>000007.44</UnitCost>
  </SALES>
</root>
于 2013-11-04T10:21:07.087 回答
0

好吧,你没有展示你迄今为止尝试过的东西,所以我只会给出一些更一般的建议。

与往常一样,如果您想保持大部分结构完好无损,请从标识模板开始,将所有输入复制到输出结构:

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

然后制作一些特殊的模板,以不同的方式处理您想要处理的标签。您的问题有很多可能的解决方案,其中之一是匹配DateSold元素并将其写为DateSoldTimeSold取决于它是元素中的第一个还是第二个子sales元素(如果它们总是以这种方式排序) .

另一种方法是匹配Sales元素,选择两个子元素并将它们以不同的方式组合/写入输出文件,并通过apply-templates调用复制其他元素(然后再次调用您的身份模板)。

具体如何做到这一点,请展示您在 XSLT 上尝试或阅读的内容。网络上有很多可用的资源。一个好的起点可能是www.w3schools.com

他们有每个 xslt 标签的例子。一个apply-templates这个

于 2013-11-04T07:49:51.280 回答