Xml 在xslt中添加更多逻辑
我的输入XML文件Xml 在xslt中添加更多逻辑,xml,xslt,xslt-1.0,xslt-2.0,Xml,Xslt,Xslt 1.0,Xslt 2.0,我的输入XML文件 <employerinfo id="2242"> <Employer> <Employeedetail>Sam SR Engineer 10%</Employeedetail> <Employeedetail>Sam SR 26%</Employeedetail> <Employeedetail>Sam SR</Employeedetail> <Employeedeta
<employerinfo id="2242">
<Employer>
<Employeedetail>Sam SR Engineer 10%</Employeedetail>
<Employeedetail>Sam SR 26%</Employeedetail>
<Employeedetail>Sam SR</Employeedetail>
<Employeedetail>Sam GRTE</Employeedetail>
</Employer >
</employerinfo>
高级工程师10%
山姆SR 26%
老山姆
萨姆·格特
预期输出文件
<Employer>
<Employeedetails>
<Employeedetail1>
<Employeedetail>
<Name>Sam</Name>
<Grade>SR Engineer</Grade>
<Experience>10</Experience>
</Employeedetail>
<Employeedetail>
<Name>Sam</Name>
<Grade>SR</Grade>
<Experience>26</Experience>
<Employeedetail>
<Name>Sam</Name>
<Grade>SR</Grade>
<Experience>10</Experience>
</Employeedetail>
<Employeedetail>
<Name>Sam</Name>
<Grade>GRTE</Grade>
<Experience>10</Experience>
</Employeedetail >
</Employeedetail1>
</Employeedetails>
</Employer>
山姆
高级工程师
10
山姆
SR
26
山姆
SR
10
山姆
GRTE
10
我尝试在Google中搜索这种类型的XML在XSLT1.0和XSLT2.0中该怎么做
其他几个堆栈溢出用户也帮助了我。但这仍然是最后的细节输入XML
如果我在XML中添加了额外的父节点,并且在XSLT中进行了修改,那么我就得不到值
请帮帮我
提前感谢以下是我目前的解决方案:
<?xml version='1.0' encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
version='1.0'
>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="Employer">
<Employer>
<Employeedetails>
<Employeedetail1>
<xsl:apply-templates select="Employeedetail"/>
</Employeedetail1>
</Employeedetails>
</Employer>
</xsl:template>
<xsl:template match="Employeedetail">
<Employeedetail>
<xsl:variable name="s1" select="normalize-space(.)"/>
<xsl:variable name="name" select="substring-before($s1,' ')"/>
<Name><xsl:value-of select="$name"/></Name>
<xsl:variable name="s2" select="substring-after($s1,' ')"/>
<xsl:call-template name="t">
<xsl:with-param name="s" select="$s2"/>
<xsl:with-param name="grade"></xsl:with-param>
<xsl:with-param name="exp"></xsl:with-param>
</xsl:call-template>
</Employeedetail>
</xsl:template>
<xsl:template name="t">
<xsl:param name="s"/>
<xsl:param name="grade"/>
<xsl:param name="exp"/>
<xsl:choose>
<xsl:when test="contains($s,' ')">
<xsl:call-template name="t">
<xsl:with-param name="s" select="substring-after($s,' ')"/>
<xsl:with-param name="grade"><xsl:value-of select="$grade"/><xsl:text> </xsl:text><xsl:value-of select="substring-before($s,' ')"/></xsl:with-param>
<xsl:with-param name="exp"><xsl:value-of select="substring-after($s,' ')"/></xsl:with-param>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="string-length($exp)>0">
<Grade><xsl:value-of select="normalize-space($grade)"/></Grade>
<Experience><xsl:value-of select="$exp"/></Experience>
</xsl:when>
<xsl:otherwise>
<Grade><xsl:value-of select="normalize-space($s)"/></Grade>
<Experience>10</Experience>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
10
结果:
<Employer>
<Employeedetails>
<Employeedetail1>
<Employeedetail>
<Name>Sam</Name>
<Grade>SR Engineer</Grade>
<Experience>10%</Experience>
</Employeedetail>
<Employeedetail>
<Name>Sam</Name>
<Grade>SR</Grade>
<Experience>26%</Experience>
</Employeedetail>
<Employeedetail>
<Name>Sam</Name>
<Grade>SR</Grade>
<Experience>10</Experience>
</Employeedetail>
<Employeedetail>
<Name>Sam</Name>
<Grade>GRTE</Grade>
<Experience>10</Experience>
</Employeedetail>
</Employeedetail1>
</Employeedetails>
</Employer>
山姆
高级工程师
10%
山姆
SR
26%
山姆
SR
10
山姆
GRTE
10
这非常困难,因为雇主的详细信息没有一致的空格。i、 e.“Sam高级工程师10%”与“Sam高级工程师26%”。名称总是一个词吗?输入XML完全不适合于所需的输出,因为它不包含任何XSLT逻辑为实现输出所期望的信息。例如,输入没有表明“高级工程师”显然与等级有关。像这样的任何转换都必须进行非常硬的编码,因为几乎没有动态的机会。您好@pierre感谢您的输出我这边本身缺少一个步骤我不想要输出中的%。您能帮我解决这个问题吗xpath函数translate:select=“translate($exp,%,”),“”)感谢所有帮助我回答上述问题的人。大家好,我知道如何在tomcat中使用XSLT2.0。这里有人能帮我吗
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="Employer">
<Employer>
<Employeedetails>
<Employeedetail1>
<xsl:apply-templates/>
</Employeedetail1>
</Employeedetails>
</Employer>
</xsl:template>
<xsl:template match="Employeedetail">
<xsl:analyze-string select="." regex="^(.*) ((SR|GR).*?)( ([0-9]+)%)?$">
<xsl:matching-substring>
<Employeedetail>
<Name><xsl:value-of select="regex-group(1)"/></Name>
<Grade><xsl:value-of select="regex-group(2)"/></Grade>
<Experience><xsl:value-of select="if(regex-group(5)) then regex-group(5) else 10"/></Experience>
</Employeedetail>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:template>
</xsl:stylesheet>