Xml 在XSLT2.0中通过很少的元素转换获取重复元素
关于重复元素和如何使用xsl标识模板,我已经讲了很多内容。但我的要求是重复大多数元素,其中有两个字段需要转换 以下是我的意见: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>
<?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>