Xml 在xslt中添加更多逻辑

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

我的输入XML文件

<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)&gt;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>