【问题标题】:Extract delimited data提取分隔数据
【发布时间】:2020-05-27 16:31:01
【问题描述】:

我的数据在输入中以以下格式分隔

A;B;C;D;E;F;G;H;I;J;K

输出应该是这样的

<1>A</1>
<2>B</2>
<3>C</3>
<4>D</4>
<5>E</5>
<6>F</6>
<7>G</7>
<8>H</8>
<9>I</9>
<10>J</10>
<11>K</11>

上面提到的是这个分隔字符串的最大长度。已经编写了一个 xslt 以便能够分隔分隔的字符串并使用下面提到的多个子字符串获得所需的输出并能够获得输出

<xsl:value-of
 select="substring-before(substring-after(substring-after(substring-after(string,';'),';'),';'),';')"/>

问题:提供者并非一直以上述格式(A;B;C;D;E;F;G;H;I;J;K)发送数据。

当有空值时,我们假设它看起来像A;B;C;D;;;;;;;

但是在这种情况下,我们收到的是A;B;C;D,之后没有空分隔符。

假设我们的字符串是固定长度的,我们在之前和之后使用的提取逻辑。如果不遵守长度,我们将无法提取数据。

有人可以帮助处理与接收到的长度无关的逻辑,即在第一个分隔符之前的数据始终是 并且在 1 到 2 个分隔符之间是 等等。

【问题讨论】:

  • 您不能将&lt;1&gt;A&lt;/1&gt; 作为输出:元素名称不能以数字开头。
  • 我的回答有帮助还是您还有问题?
  • 嘿,帮助谢谢,但遇到了另一个我正在解决的问题..感谢您的帮助。
  • 我现在正试图以特定的顺序连接每个单独项目中的这些值,用“_”分隔但无法成功。
  • @vas - 您应该发布一个新问题,其中包含可重现的示例以及您想要获得的输出示例。我相信有人会提供帮助。

标签: xml xslt xslt-1.0


【解决方案1】:

您可以使用递归模板来处理令牌。您可以传入总数量,因此如果不是所有标记都存在,则仍会创建一个元素。

示例...

XML 输入

<doc>
    <string>A;B;C;D;E;F;G;H;I;J;K</string>
    <string>A;B;C;D</string>
    <string>A;B;C;;;;G;H;I;J;K</string>
    <string/>
</doc>

XSLT 1.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="string">
    <xsl:copy>
      <xsl:call-template name="process_string"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template name="process_string">
    <xsl:param name="str" select="."/>
    <xsl:param name="qty" select="11"/>
    <xsl:param name="item_cnt" select="1"/>
    <xsl:variable name="remaining_qty" select="$qty - 1"/>
    <xsl:variable name="item_value" select="normalize-space( 
      substring-before(concat($str, ';'), ';'))"/>
    <xsl:element name="item{$item_cnt}">
      <xsl:value-of select="$item_value"/> 
    </xsl:element>
    <xsl:if test="substring-after($str,';') or $remaining_qty > 0">
      <xsl:call-template name="process_string"> 
        <xsl:with-param name="str" select="substring-after($str,';')"/>
        <xsl:with-param name="qty" select="$remaining_qty"/>
        <xsl:with-param name="item_cnt" select="$item_cnt + 1"/>
      </xsl:call-template>              
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

输出

<doc>
   <string>
      <item1>A</item1>
      <item2>B</item2>
      <item3>C</item3>
      <item4>D</item4>
      <item5>E</item5>
      <item6>F</item6>
      <item7>G</item7>
      <item8>H</item8>
      <item9>I</item9>
      <item10>J</item10>
      <item11>K</item11>
   </string>
   <string>
      <item1>A</item1>
      <item2>B</item2>
      <item3>C</item3>
      <item4>D</item4>
      <item5/>
      <item6/>
      <item7/>
      <item8/>
      <item9/>
      <item10/>
      <item11/>
   </string>
   <string>
      <item1>A</item1>
      <item2>B</item2>
      <item3>C</item3>
      <item4/>
      <item5/>
      <item6/>
      <item7>G</item7>
      <item8>H</item8>
      <item9>I</item9>
      <item10>J</item10>
      <item11>K</item11>
   </string>
   <string>
      <item1/>
      <item2/>
      <item3/>
      <item4/>
      <item5/>
      <item6/>
      <item7/>
      <item8/>
      <item9/>
      <item10/>
      <item11/>
   </string>
</doc>

小提琴:http://xsltfiddle.liberty-development.net/93dFK9i/1

【讨论】:

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