XSL

2012-01-23 5 views
1

를 사용하여 XML 문자열의 일부를 교체 I이 다음 XML :XSL

<links url="../servlet/SearchServlet?query=contact&filter=&sort=relevance&sortdir=desc&col=5&startdate=0&enddate=0&xsl=xml&page="> 

<link page="date" url="../servlet/SearchServlet?query=contact&filter=&sort=date&col=5&startdate=0&enddate=0&page=1&xsl=xml"/> 

내가 링크 변환이 XSL을 사용하고 있습니다 :

<xsl:for-each select="//link"> 

      <xsl:choose> 
       <xsl:when test="@page='next'"> 
        <xsl:text></xsl:text> 
        <a href="{@url}">&gt;&gt;</a> 
       </xsl:when> 
       <xsl:when test="@page='prev'"> 
        <a href="{@url}">&lt;&lt;</a> 
        <xsl:text></xsl:text> 
       </xsl:when> 

       <xsl:when test="@page='date'"/> 
       <xsl:when test="@page='relevance'"/> 
       <xsl:when test="@page='alpha'"/> 

      </xsl:choose> 
     </xsl:for-each> 

까다로운 부분은 지금 내가 원하는되는을 링크의 url 부분을 ../servlet/SearchServlet에서 ../search

으로 대체하려면 어떻게해야합니까? 나는 using this template을 시도했지만 그것은 전체 url을 대체합니다. 당신이 선택적으로 값을 대체/다른 검색을 제공

<xsl:apply-templates select="@url" /> 
    <xsl:with-param name="search" select="'xyz'" /> 
    <xsl:with-param name="replace" select="'foo'" /> 
</xsl:apply-templates> 

를 사용할 수

<a> 
    <xsl:apply-templates select="@url" /> 
    <xsl:text>&lt;&lt;</xsl:text> 
</a> 

참고로

+0

링크 된 템플릿을 어떻게 사용했는지 보여주십시오. –

답변

5
<xsl:template match="link/@url"> 
    <xsl:param name="search" select="'../servlet/SearchServlet'" /> 
    <xsl:param name="replace" select="'../search'" /> 
    <xsl:attribute name="href"> 
    <xsl:choose> 
     <xsl:when test="contains(., $search)"> 
     <xsl:value-of select="concat($replace, substring-after(., $search))" /> 
     </xsl:when> 
     <xsl:otherwise> 
     <xsl:value-of select="." /> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:attribute> 
</xsl:template> 

전화.

+0

내가 찾고있는 것. 감사! – robasta

+0

Tomalak, 당신은 simler와 더 짧은 해결책을 보길 원할 것입니다 :) –

+0

@Dimitre 나는 일반적인 변형을 목표로하고있었습니다. 그러나 그렇습니다, AVTs는 특정한 경우를 위해 더 좋습니다. – Tomalak

4

이 어떤 명시 적 조건의 지시 또는 xsl:attribute을 사용하지 않는 간단하고 짧은, 완벽한 솔루션입니다 :

<links> 
<link page="prev" url="../servlet/SearchServlet?query=contact&amp;filter=&amp;sort=relevance&amp;sortdir=desc&amp;col=5&amp;startdate=0&amp;enddate=0&amp;xsl=xml&amp;page="/> 
<link page="date" url="../servlet/SearchServlet?query=contact&amp;filter=&amp;sort=date&amp;col=5&amp;startdate=0&amp;enddate=0&amp;page=1&amp;xsl=xml"/> 
<link page="next" url="../servlet/SearchServlet?query=contact&amp;filter=&amp;sort=date&amp;col=5&amp;startdate=0&amp;enddate=0&amp;page=1&amp;xsl=xml"/> 
</links> 

: 다음과 같은 XML 문서에 적용

<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="pTarget" select="'../servlet/SearchServlet'"/> 
<xsl:param name="pRep" select="'../search'"/> 

<xsl:template match="link"> 
    <xsl:variable name="vCUrl" select="concat(@url, $pTarget)"/> 

    <a url="{substring-before($vCUrl,$pTarget)}{$pRep}{substring-after(@url,$pTarget)}"> 
    <xsl:apply-templates select="@page"/> 
    </a> 
</xsl:template> 

<xsl:template match="link/@page[. = 'next']">>></xsl:template> 
<xsl:template match="link/@page[. = 'prev']">&lt;&lt;</xsl:template> 

<xsl:template match="link[not(@page='next' or @page='prev')]"/> 
</xsl:stylesheet> 

원하는 정확한 결과가 생성됩니다. :

,691,363,210
<a url="../search?query=contact&amp;filter=&amp;sort=relevance&amp;sortdir=desc&amp;col=5&amp;startdate=0&amp;enddate=0&amp;xsl=xml&amp;page=">&lt;&lt;</a> 
<a url="../search?query=contact&amp;filter=&amp;sort=date&amp;col=5&amp;startdate=0&amp;enddate=0&amp;page=1&amp;xsl=xml">&gt;&gt;</a> 

설명 : AVT의

  1. 적절한 사용 (Attribute Value Templates) 패턴 매칭 템플릿

  2. 적절한 사용.

  3. 조건부 처리가 필요 없도록 문자열에 센티널을 추가합니다.