Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 拆分逗号值以分隔节点/元素XSLT_Xml_Xslt_Xslt 1.0_Xslt 2.0_Xslt 3.0_Xmlstarlet_Libxslt_Exslt - Fatal编程技术网

Xml 拆分逗号值以分隔节点/元素XSLT

Xml 拆分逗号值以分隔节点/元素XSLT,xml,xslt,xslt-1.0,xslt-2.0,xslt-3.0,xmlstarlet,libxslt,exslt,Xml,Xslt,Xslt 1.0,Xslt 2.0,Xslt 3.0,Xmlstarlet,Libxslt,Exslt,我有一个场景,在其中一个XML字段中,源应用程序发送一个逗号分隔的值(根据它们的限制),但我们的目标系统只接受字段中的一个值(不需要id排序)。有人能帮忙吗。提前谢谢 当前XML <root> <order> <id>1</id> <value>RU</value> </order> <order> <id>2<

我有一个场景,在其中一个XML字段中,源应用程序发送一个逗号分隔的值(根据它们的限制),但我们的目标系统只接受字段中的一个值(不需要id排序)。有人能帮忙吗。提前谢谢

当前XML

<root>
    <order>
        <id>1</id>
        <value>RU</value>
    </order>
    <order>
        <id>2</id>
        <value>SA</value>
    </order>
    <order>
        <id>3</id>
        <value>MX,BR,US</value>
    </order>
    <order>
        <id>4</id>
        <value>IN,SL</value>
    </order>
</root>

1.
茹
2.
沙特阿拉伯
3.
MX,BR,美国
4.
在,SL
预期输出:

<root>
    <order>
        <id>1</id>
        <value>RU</value>
    </order>
    <order>
        <id>2</id>
        <value>SA</value>
    </order>
    <order>
        <id>3</id>
        <value>MX</value>
    </order>
    <order>
        <id>4</id>
        <value>IN</value>
    </order>
    <order>
        <id>3</id>
        <value>BR</value>
    </order>
    <order>
        <id>3</id>
        <value>US</value>
    </order>
    <order>
        <id>4</id>
        <value>SL</value>
    </order>
</root>

1.
茹
2.
沙特阿拉伯
3.
MX
4.
在里面
3.
溴
3.
美国
4.
SL
您可以使用该功能,如下所示:

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

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="order[contains(value,',')]">
    <xsl:variable name="currentOrder" select="."/>
    <xsl:for-each select="tokenize(value,',')">
      <order>
        <id><xsl:value-of select="$currentOrder/id"/></id>
        <value><xsl:value-of select="."/></value>
      </order>
    </xsl:for-each>
  </xsl:template>
  
</xsl:stylesheet>

查看此处的工作情况:

您可以使用该功能,如下所示:

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

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="order[contains(value,',')]">
    <xsl:variable name="currentOrder" select="."/>
    <xsl:for-each select="tokenize(value,',')">
      <order>
        <id><xsl:value-of select="$currentOrder/id"/></id>
        <value><xsl:value-of select="."/></value>
      </order>
    </xsl:for-each>
  </xsl:template>
  
</xsl:stylesheet>


在这里查看它的工作情况:

如果您在一个系统上,您可以说

xmlstarlet sel\
-t-m‘根’\
-e'{name()}'-n\
-我是“订单”\
--var nid='id'\
-m'str:tokenize(值,“”,“”)\
-e“订单”\
-c'$nid'\
-e'值'-v'.-b\
-b-n\
file.xml
在哪里

  • -t
    xsl:template
    匹配
    /
  • -m
    映射到
    xsl:for each
  • -e
    xsl:element
  • -c
    xsl:copy of
  • -v
    xsl:value of
  • -b
    结束当前容器(
    -m
    -e
    ,…);只需要 如果出现任何模板选项(在
    -t
    之后)
  • -n
    输出换行符
  • 是EXSLT工作的一部分
  • 缩进字符和行连续字符是可选的
  • 你的
    -眼睛会有片刻的放松
要输出:


1RU
2SA
3MX
3BR
3US
4英寸
4SL
要列出生成的XSLT代码,请在
-t
选项之前添加
-C


如果您所使用的系统依赖并因此仅支持-您可以说

xmlstarlet sel\
-t-m‘根’\
-e'{name()}'-n\
-我是“订单”\
--var nid='id'\
-m'str:tokenize(值,“”,“”)\
-e“订单”\
-c'$nid'\
-e'值'-v'.-b\
-b-n\
file.xml
在哪里

  • -t
    xsl:template
    匹配
    /
  • -m
    映射到
    xsl:for each
  • -e
    xsl:element
  • -c
    xsl:copy of
  • -v
    xsl:value of
  • -b
    结束当前容器(
    -m
    -e
    ,…);只需要 如果出现任何模板选项(在
    -t
    之后)
  • -n
    输出换行符
  • 是EXSLT工作的一部分
  • 缩进字符和行连续字符是可选的
  • 你的
    -眼睛会有片刻的放松
要输出:


1RU
2SA
3MX
3BR
3US
4英寸
4SL
要列出生成的XSLT代码,请在
-t
选项之前添加
-C



回答得好,我这边+1!回答得好,我这边+1!