【问题标题】:condition checking in xml using xslt使用 xslt 在 xml 中检查条件
【发布时间】:2012-07-11 08:49:48
【问题描述】:

输入 XML

<Employer>
     <Employeedetail>Sam SR Engineer 10%</ Employeedetail >
     <Employeedetail>Sam SR 10%</ Employeedetail >
     <Employeedetail>Sam SR</ Employeedetail >
</ Employer >

下面是输出输入 XML

<Employer>
 < Employeedetails >
  < Employeedetail1>
    < Employeedetail >
       <Name>Sam</ Name >
       <Grade> SR Engineer </ Grade >
       <Experience>10</ Experience >
    </ Employeedetail >
  </ Employeedetail1>
 </ Employeedetails>
</ Employer >

 <Employer>
 < Employeedetails >
  < Employeedetail1>
    < Employeedetail >
       <Name>Sam</ Name >
       <Grade>SR</ Grade >
       <Experience>10</ Experience >
    </ Employeedetail >
  </ Employeedetail1>
 </ Employeedetails>
</ Employer >

 <Employer>
 < Employeedetails >
  < Employeedetail1>
    < Employeedetail >
       <Name>Sam</ Name >
       <Grade>SR</ Grade >
       <Experience>10</ Experience >
    </ Employeedetail >
  </ Employeedetail1>
 </ Employeedetails>
</ Employer >

如果我们有三个空格分隔的节点,他们会帮助堆栈溢出的人,我们将获得输出

但是,如果您查看 Sr Engineer 等级,这将再次进入等级,但我所拥有的代码将在 Grade 元素中显示 SR,而工程师和 10(经验)将出现在 Experience 中元素。

如果没有经验值,则默认为 10。

在上面的输入 XML 中会有很多员工详细信息。

Here is the link for that xslt

请帮忙解答以上问题

提前致谢

【问题讨论】:

    标签: xml xslt xslt-1.0


    【解决方案1】:

    查看xsl:analyze-string http://www.w3.org/TR/xslt20/#analyze-string 例如沿着

    <xsl:template match="Employeedetail">
     <Employeedetail>
      <xsl:analyze-string="." regex="(\w+)\s+(\w+(\s\w+)?)\s+(\d+)">
        <xsl:matching-substring>
           <Name><xsl:value-of select="regex-group(1)"/></Name>
           <Grade><xsl:value-of select="regex-group(2)"/></Grade>
           <Experience><xsl:value-of select="regex-group(4)"/></Experience>
        </xsl:matching-substring>
      </xsl:analyze-string>
     </Employeedetail>
    </xsl:template>
    

    未经测试,但应该为您指明正确的方向。

    【讨论】:

    • 嗨@Martin 实际上我希望在 XSLT 1.0 中可以在 xslt1.0 中实现
    • 如果您不想要 XSLT 2.0 的答案,请不要用“XSLT 2.0”标记问题。
    • 抱歉,maha,analyze-string 是 XSLT 2.0 中的新功能。如果您正在寻找 XSLT 1.0 解决方案,请不要将问题标记为 xslt-2.0。至于 XSLT 2.0 方法,您使用哪种 XSLT 1.0 处理器?是否支持exslt.org/str/functions/tokenize/index.html
    【解决方案2】:

    Maha,我建议你在 XSLT 1.0 字符串函数上搜索一下。这种问题真的很琐碎,你不应该在 StackOverflow 上发帖。是的,您可能是初学者,但这并不妨碍您使用 google。

    这里有几个起点:

    1. http://www.w3schools.com/xpath/xpath_functions.asp
    2. 关于您的特定问题,请考虑函数 string-before() 和 string-after()

    【讨论】:

    • B Durkin 我在谷歌搜索这个。我不明白它是怎么来的,我是 XSLT 和 XML 的新手。
    【解决方案3】:

    这个 XSLT 1.0 转换

    <xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <xsl:output omit-xml-declaration="yes" indent="yes"/>
     <xsl:strip-space elements="*"/>
    
     <xsl:template match="Employeedetail">
      <xsl:variable name="vExp" select=
       "substring(., string-length()-2, 2)"/>
         <Employer>
          <Employeedetails>
            <Employeedetail1>
                <Employeedetail>
                 <name><xsl:value-of select="substring-before(., ' ')"/></name>
                 <grade>
                   <xsl:value-of select=
                   "substring-before(substring-after(., ' '), $vExp)"/>
                 </grade>
                 <experience><xsl:value-of select="$vExp"/></experience>
                </Employeedetail>
            </Employeedetail1>
          </Employeedetails>
         </Employer>
     </xsl:template>
    </xsl:stylesheet>
    

    应用于提供的 XML 文档时:

    <Employer>
        <Employeedetail>Sam SR Engineer 10%</Employeedetail>
    </Employer>
    

    产生想要的正确结果

    <Employer>
       <Employeedetails>
          <Employeedetail1>
             <Employeedetail>
                <name>Sam</name>
                <grade>SR Engineer </grade>
                <experience>10</experience>
             </Employeedetail>
          </Employeedetail1>
       </Employeedetails>
    </Employer>
    

    【讨论】:

    • 嗨@Dimitre,当我尝试在 saxon 中运行时,它会显示以下消息警告:在 testing.xsl 的第 2 行第 2 列第 51 列的 xsl:stylesheet:使用 xsLT 2.0 处理器运行 XSLT 1.0 样式表
    • 嗨@Dimitre我怎么能编辑这个问题你能告诉我吗
    • @maha:此消息意味着您正在使用 XSLT 2.0 处理器运行 XSLT 1.0 转换——没什么好担心的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2016-08-29
    • 2011-01-18
    相关资源
    最近更新 更多