2012-05-05 2 views
1

값이 0 일 때마다 값을 업데이트해야하는 특정 속성 (myId)이있는 문서가 있습니다. 이 문서는 내가 호출 프로그램에서 전달 된 고유 한 ID로 설정하기 위해 속성 MYID에 맞게 템플릿을 사용하고 있지만 난 단지 문서의 속성 중 하나와 일치 할이XSLT 한 번만 속성을 변경하는 템플릿 일치

<?xml version="1.0" encoding="UTF-8"?><Summary> 
<Section myId="0"> 
    <Section myId="0"> 
    <Para>...</Para> 
    </Section> 
    <Section myId="5"> 
    <Para>...</Para> 
    </Section> 
</Section> 
</Summary> 

것 같습니다. 값이 0 인 추가 속성은 다른 ID를 전달하여 업데이트됩니다. 내 템플릿은이 같은 모습을 사용하고 있습니다 :

<xsl:template  match = '@myId[.="0"]'> 
    <xsl:attribute name = "{name()}"> 
    <xsl:value-of select = "$addValue"/> 
    </xsl:attribute> 
</xsl:template> 

값 addValue이 호출 프로그램에서 전달 된 글로벌 매개 변수입니다. 오늘의 좋은 부분에 대한 답변을 검색했지만이 템플릿을 한 번만 적용 할 수는 없습니다. 결과는 myId 값을 addValue의 내용으로 바꿉니다. '@myId [.0 0]] [1]'과 (와) 일치 시키려고했는데 일치 시키려면 position() 함수를 사용하려고했지만 템플릿은 항상 0 인 모든 myId 속성에 적용됩니다.

일치하는 템플릿을 한 번만 적용 할 수 있습니까?

+0

카운트가 0 인 '선행'축을 사용해보십시오. –

답변

1

일치하는 템플릿을 한 번만 적용 할 수 있습니까?

: 템플릿 적용 여부를 여부

  1. 는 실행을 위해 선택할 수있는 템플릿을 일으키는 xsl:apply-templates에 따라 달라집니다.

  2. 또한 일치 패턴은 템플릿이 문서의 특정 노드 하나와 만 일치하도록 보장 할 수 있습니다. 이 변환이 제공된 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="pNewIdValue" select="9999"/> 
    
    
    <xsl:template match="node()|@*"> 
        <xsl:copy> 
        <xsl:apply-templates select="node()|@*"/> 
        </xsl:copy> 
    </xsl:template> 
    
    <xsl:template match= 
    "Section 
        [@myId = 0 
        and 
        not((preceding::Section | ancestor::Section) 
           [@myId = 0] 
         ) 
        ]/@myId"> 
        <xsl:attribute name="myId"><xsl:value-of select="$pNewIdValue"/></xsl:attribute> 
    </xsl:template> 
    </xsl:stylesheet> 
    

    가 :

    <Summary> 
        <Section myId="0"> 
         <Section myId="0"> 
          <Para>...</Para> 
         </Section> 
         <Section myId="5"> 
          <Para>...</Para> 
         </Section> 
        </Section> 
    </Summary> 
    

    이 원하는 정확한 결과는 다음

을 할 수있는 것입니다 생산 :

<Summary> 
    <Section myId="9999"> 
     <Section myId="0"> 
     <Para>...</Para> 
     </Section> 
     <Section myId="5"> 
     <Para>...</Para> 
     </Section> 
    </Section> 
</Summary> 
+0

'선행'에 '조상'이 포함되어 있지 않습니까, 아니면 뭔가 빠졌습니까? –

+0

@torazaburo : 아니요, 앞/뒤 축과 위/아래 축이 겹치지 않습니다. W3C XPath Spec http://www.w3.org/TR/xpath/#axes 글 머리 기호 7 및 8에서 이것을 참조하십시오. –

+0

@dimitre : 템플릿 일치에 선행/조상 축을 사용하는 방법을 알 수 없습니다 특성 어쩌면 그럴 수도 없지만 당신의 솔루션은 내가 필요한 것을 정확하게 수행합니다. 도와 주셔서 정말로 고맙습니다! 나는 여기에 깔끔한 매칭 기법을 배웠다. – VEnglisch