Будет ли один файл XSLT решить эту проблему - продолжение ..? - PullRequest
0 голосов
/ 01 ноября 2011

Этот вопрос связан с моим постом - Решит ли этот файл один XSLT-файл .. или ...?

Ниже приведен мой 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-файл - (хорошо, Димитр дал этот ответ, но теперь мой;))

<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 извлечет соответствующий <Name>, которыйпередается с Java.

Теперь мне нужно знать, как я могу изменить этот XSLT, чтобы, если я передал Oracle в качестве параметра, то те, у кого Oracle в <CompSkills>, были бы перечислены.Oracle будет одним из CompSkills ..

Заранее спасибо - Джон

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

Вы можете сделать это, используя contains().

Эта измененная версия вашей таблицы стилей будет вытягивать CV, если Name соответствует параметру 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>
1 голос
/ 01 ноября 2011

XPath 1.0, простой способ: contains функция, например:

<xsl:if test="contains(CompSkills, $pSkill)">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...