【问题标题】:split in xslt 1.0 with the delimiter &使用分隔符 & 在 xslt 1.0 中拆分
【发布时间】:2019-12-31 22:39:32
【问题描述】:

您好,我下面的标签用 & 分隔,我需要在不同的标签中获取每个单独的字段,以便稍后在数据库的单独字段中写入,任何人在 xslt 1.0 中有任何示例吗?

<StatusMsg>
transfer-encoding=chunked&Server=nginx%2F1.13.12&MeusPedidosURL=http%3A%2F%2Fintegracao.meuspedidos.com.br%2Fapi%2Fv1%2Fclientes4118343%2F&Connection=keep-alive&MEUSPEDIDOS_QTDE_TOTAL_REGISTROS=0&Vary=Authorization%2C+Cookie&MeusPedidosID=4118343&Date=Tue%2C+31+Dec+2019+22%3A16%3A46+GMT&Content-Type=text%2Fplain
</StatusMsg>

我需要的示例...

<MeusPedidosID>4118343</MeusPedidosID>
<MeusPedidosURL>http%3A%2F%2Fintegracao.meuspedidos.com.br%2Fapi%2Fv1%2Fclientes4118343%2F</MeusPedidosURL>

【问题讨论】:

  • 带有非转义 & 符号的输入甚至似乎都不是格式良好的 XML,无法提供给 XML 解析器。至于 XSLT 1 和拆分字符串,请找出您使用的 XSLT 1 处理器以及它是否支持 EXSLT 扩展或调用宿主语言以使用其希望更好的字符串函数支持。

标签: xslt split xslt-1.0


【解决方案1】:

使用格式良好的输入,例如:

XML

<StatusMsg>transfer-encoding=chunked&amp;Server=nginx%2F1.13.12&amp;MeusPedidosURL=http%3A%2F%2Fintegracao.meuspedidos.com.br%2Fapi%2Fv1%2Fclientes4118343%2F&amp;Connection=keep-alive&amp;MEUSPEDIDOS_QTDE_TOTAL_REGISTROS=0&amp;Vary=Authorization%2C+Cookie&amp;MeusPedidosID=4118343&amp;Date=Tue%2C+31+Dec+2019+22%3A16%3A46+GMT&amp;Content-Type=text%2Fplain</StatusMsg>

您可以使用substring-before()substring-after() 函数来提取所需的值 - 例如,以下样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <xsl:variable name="statusMsg" select="concat(StatusMsg, '&amp;')" />
    <output>
        <MeusPedidosID>
            <xsl:value-of select="substring-before(substring-after($statusMsg, 'MeusPedidosID='), '&amp;')"/>
        </MeusPedidosID>
        <MeusPedidosURL>
            <xsl:value-of select="substring-before(substring-after($statusMsg, 'MeusPedidosURL='), '&amp;')"/>
        </MeusPedidosURL>
    </output>
</xsl:template>

</xsl:stylesheet>

将产生:

结果

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <MeusPedidosID>4118343</MeusPedidosID>
  <MeusPedidosURL>http%3A%2F%2Fintegracao.meuspedidos.com.br%2Fapi%2Fv1%2Fclientes4118343%2F</MeusPedidosURL>
</output>

如果要提取所有在给定字符串中编码的字段,可以使用:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/">
    <output>
        <xsl:call-template name="split">
            <xsl:with-param name="string" select="concat(StatusMsg, '&amp;')"/>
        </xsl:call-template>
    </output>
</xsl:template>

<xsl:template name="split">
    <xsl:param name="string"/>
    <xsl:if test="contains($string, '=')">
        <xsl:element name="{substring-before($string, '=')}">
            <xsl:value-of select="substring-before(substring-after($string, '='), '&amp;')" />
        </xsl:element>
        <!-- recursive call -->
        <xsl:call-template name="split">
            <xsl:with-param name="string" select="substring-after($string, '&amp;')" />
        </xsl:call-template>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>

得到:

结果

<?xml version="1.0" encoding="UTF-8"?>
<output>
  <transfer-encoding>chunked</transfer-encoding>
  <Server>nginx%2F1.13.12</Server>
  <MeusPedidosURL>http%3A%2F%2Fintegracao.meuspedidos.com.br%2Fapi%2Fv1%2Fclientes4118343%2F</MeusPedidosURL>
  <Connection>keep-alive</Connection>
  <MEUSPEDIDOS_QTDE_TOTAL_REGISTROS>0</MEUSPEDIDOS_QTDE_TOTAL_REGISTROS>
  <Vary>Authorization%2C+Cookie</Vary>
  <MeusPedidosID>4118343</MeusPedidosID>
  <Date>Tue%2C+31+Dec+2019+22%3A16%3A46+GMT</Date>
  <Content-Type>text%2Fplain</Content-Type>
</output>

【讨论】:

  • 很好......它工作......非常感谢。我已经用 C# 语言创建了一个解决方法,但我很高兴你的脚本有效
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多