Xml 在XSLT2.0中通过很少的元素转换获取重复元素

Xml 在XSLT2.0中通过很少的元素转换获取重复元素,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,关于重复元素和如何使用xsl标识模板,我已经讲了很多内容。但我的要求是重复大多数元素,其中有两个字段需要转换 以下是我的意见: <?xml version="1.0" encoding="UTF-8"?> <Roots xmlns="urn:com.mydish/extps"> <Root> <Worker>100</Worker> <Group></Group>

关于重复元素和如何使用xsl标识模板,我已经讲了很多内容。但我的要求是重复大多数元素,其中有两个字段需要转换

以下是我的意见:

<?xml version="1.0" encoding="UTF-8"?>
<Roots xmlns="urn:com.mydish/extps">
    <Root>
        <Worker>100</Worker>
        <Group></Group>
        <Amount>1165851.81</Amount>
        <Currency>USD</Currency>
        <Check>201705091204</Check>
        <File_Name>1.pdf</File_Name>
    </Root>
     <Root>
        <Worker>20</Worker>
        <Group></Group>
        <Amount>231456.41</Amount>
        <Currency>USD</Currency>
        <Check>201705091204</Check>
        <File_Name>2.pdf</File_Name>
    </Root>
 </Roots>

100
1165851.81
美元
201705091204
1.pdf
20
231456.41
美元
201705091204
2.pdf
输出必须是:

<?xml version="1.0" encoding="UTF-8"?>
<Roots xmlns="urn:com.mydish/extps">
    <Root>
        <Worker>C10</Worker>
        <Group>Group1</Group>
        <Amount>1165851.81</Amount>
        <Currency>USD</Currency>
        <Check>201705091204</Check>
        <File_Name>1.pdf</File_Name>
    </Root>
     <Root>
        <Worker>C20</Worker>
        <Group>Group2</Group>
        <Amount>231456.41</Amount>
        <Currency>USD</Currency>
        <Check>201705091204</Check>
        <File_Name>2.pdf</File_Name>
    </Root>
 </Roots>

C10
第一组
1165851.81
美元
201705091204
1.pdf
C20
第2组
231456.41
美元
201705091204
2.pdf
所以,逻辑取决于要转换的输入辅助对象的长度、输出辅助对象和组字段

若输入辅助对象的长度为3位,则输出辅助对象将为C,前两位(C10)和组将为Group1。若输入辅助长度为2位,那个么只需将C连接到输出辅助长度,如(C20),组将为Group2

Rest必须与输入中的相同

如何改变这一点? 下面的那个对吗?我知道这不会像现在这样起作用

<Worker>
    <xsl:value-of select="if string-length(Worker)='3' then concat('C',substring(Worker,1,2)) else concat('C',Worker)" />
</Worker>
<Group>
     <xsl:value-of select="if string-length(Worker)='3' then 'Group1' else 'Group2'" />
</Group>    

尝试以下脚本:

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:my="urn:com.mydish/extps"
  xpath-default-namespace="urn:com.mydish/extps">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:strip-space elements="*"/>

  <xsl:template match="Worker">
    <xsl:copy>
      <xsl:value-of select="if (string-length() = 3)
        then concat('C', substring(., 1, 2))
        else concat('C', .)" />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="Group">
    <xsl:copy>
      <xsl:value-of select="if (string-length(../Worker) = 3)
        then 'Group1' else 'Group2'" />
    </xsl:copy>
  </xsl:template>

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

您非常接近正确的解决方案

我添加了名称空间处理,并对代码做了一些细微的更改

也许你应该读一点来学习:

  • 关于名称空间处理
  • 为XPath表达式设置默认命名空间
  • 模板中当前对象(
    )的概念,以及 它的价值是什么,
  • 如何引用同级对象(例如Worker元素 从组模板内

对于
工人
,您可以简单地执行以下操作:

<xsl:template match="Worker">
    <xsl:copy>
        <xsl:text>C</xsl:text>
        <xsl:value-of select="substring(., 1, 2)"/>
    </xsl:copy>
</xsl:template>

当然,这是对身份转换模板的补充。

或者,对组使用两个模板:
Group1
谢谢,这很有效。当然,我们将学习您指出的主题。这确实很有帮助。
<xsl:template match="Group">
    <xsl:copy>
        <xsl:value-of select="if (string-length(../Worker)=3) then 'Group1' else 'Group2'" />
    </xsl:copy>
</xsl:template>