单个XSLT文件是否会解决此问题 - 继续..?

时间:2011-11-01 04:30:47

标签: java xml xslt xpath

这个问题与我的这篇文章有关 - Will a Single XSLT file solve this issue..or...?

下面是我的XML文件 -

<CVs>
 <CV>
  <Name>ABC</Name>
  <Address></Address>
  <Introduction></Introduction>
  <CompSkills>Java, XSLT, XPATH, XML, Oracle, VB.NET</CompSkills>
  <Experience>
    <Profile></Profile>
    <Duration></Duration>
    <Info></Info>
  </Experience>
  <Experience>
    <Profile></Profile>
    <Duration></Duration>
    <Info></Info>
  </Experience>
  <Experience>
    <Profile></Profile>
    <Duration></Duration>
    <Info></Info>
  </Experience>
<CV>
<CV>
 <Name>XYZ</Name>
 <Address></Address>
 <Introduction></Introduction>
 <CompSkills>Java, XSLT, XPATH, XML, JSP, HTML</CompSkills>
 <Experience>
   <Profile></Profile>
   <Duration></Duration>
   <Info></Info>
 </Experience>
 <Experience>
   <Profile></Profile>
   <Duration></Duration>
   <Info></Info>
 </Experience>
 <Experience>
   <Profile></Profile>
   <Duration></Duration>
   <Info></Info>
 </Experience>

下面是我的XSLT文件 - (Dimitre给出了这个答案,但现在是我的;)

<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:param name="pName" select="'XYZ'"/>

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

 <xsl:template match="CV">
   <xsl:if test="$pName = Name or $pName='*'">
     <xsl:call-template name="identity"/>
   </xsl:if>
 </xsl:template>

</xsl:stylesheet>

上面的XSLT将提取从Java传递的匹配<Name>

现在我需要知道如何修改这个XSLT,这样如果我将 Oracle 作为参数传递,那么 那些在<CompSkills>中拥有Oracle的人会被列入名单。 Oracle将成为CompSkills之一......

提前致谢 - 约翰

2 个答案:

答案 0 :(得分:1)

XPath 1.0,简单方法:contains功能,例如:

<xsl:if test="contains(CompSkills, $pSkill)">

答案 1 :(得分:1)

您可以使用contains()

来完成此操作

如果CVName参数匹配或pName包含CompSkills参数,则此修改后的样式表将提取pSkill

<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:param name="pName" select="'XYZ'"/>
  <xsl:param name="pSkill" select="'Oracle'"/>

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

  <xsl:template match="CV">
    <xsl:if test="$pName = Name or $pName='*' or
                  contains(CompSkills,$pSkill)">
      <xsl:call-template name="identity"/>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>