2010-08-10 3 views
0

회사에서 현재 다이어그램 집합을 출력하는 게시를 만듭니다. 게시자가 주어진 특성 값을 사용하여 다이어그램을 검색 할 수 있습니다.자식 노드의 값을 기준으로 부모/조상 노드 선택

값이 첫 번째 속성 노드에 포함되어있는 경우에만 작동합니다.

나와 다른 동료가 모든 속성을 검색하도록 수정하려고했습니다.

다음은 속성 검색에 사용되는 xsl 코드입니다. 그것은 자식 다이어그램 요소가 사용자가 입력 한 단어를 포함하고 있는지보기 위해 폴더 다이어그램과 모양 요소를보고 있습니다. 여기

 <xsl:template name="testObject"> 
    <xsl:if test="(name() = 'Shape' and $includeShapes) or (name() = 'Folder' and $includeFolders) or (name() = 'Document' and $includeDocuments) or (name() = 'Diagram' and $includeDiagrams)"> 
     <xsl:variable name="objXMLLocation"> 
      <xsl:choose> 
       <xsl:when test="name() = 'Folder'"> 
        <xsl:value-of select="concat(@ID, '/folder.xml')" /> 
       </xsl:when> 
       <xsl:when test="name() = 'Document'"> 
        <xsl:value-of select="concat(@ID, '/document.xml')" /> 
       </xsl:when> 
       <xsl:when test="name() = 'Diagram'"> 
        <xsl:value-of select="concat(@ID, '/diagram.xml')" /> 
       </xsl:when> 
       <xsl:when test="name() = 'Shape'"> 
        <xsl:value-of select="concat(../../@ID, '/', ../../@ID, '_files/', @Source)" /> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:variable> 

     <xsl:if test="js:fileExists($objXMLLocation)"> 
      <xsl:variable name="objXML" select="document($objXMLLocation)" /> 
      <xsl:choose> 
       <xsl:when test="$searchName"> 
        <xsl:if test="js:containsKeywords($objXML/*/Properties/RepositoryName, $searchKeywords)"> 
         <xsl:apply-templates mode="render" select="."> 
          <xsl:with-param name="fullXML" select="$objXML" /> 
         </xsl:apply-templates> 
        </xsl:if> 
       </xsl:when> 
       <xsl:when test="$searchDescription"> 
        <xsl:if test="js:containsKeywords($objXML/*/Properties/Description, $searchKeywords)"> 
         <xsl:apply-templates mode="render" select="."> 
          <xsl:with-param name="fullXML" select="$objXML" /> 
         </xsl:apply-templates> 
        </xsl:if> 
       </xsl:when> 
       <xsl:when test="$searchAttributes"> 
        <xsl:if test="name() != 'Folder'">      
        <xsl:if test="js:containsKeywords($objXML/*/CustomAttributes/Attribute/Value,$searchKeywords)"> 
         <xsl:apply-templates mode="render" select="."> 
          <xsl:with-param name="fullXML" select="$objXML" /> 
         </xsl:apply-templates> 
        </xsl:if> 
        </xsl:if> 
       </xsl:when> 
      </xsl:choose> 
     </xsl:if> 
    </xsl:if> 
</xsl:template> 

자바 스크립트 함수가 사용자에 의해 입력 된 검색 단어 바늘 파라미터의 문자열이 요소 값 또는 사용자가인지 특성 건초 파라미터 안에 존재하는지 보이는 containsKeyword 인 출판물 검색. 나는 정확히 무슨 일이 일어나는지 확신 할 수는 없지만 올바르게 작동하는 것처럼 보입니다.

function containsKeywords(haystack, needles) { 
     var ks = needles[0].selectNodes('//K'); 
     var n; 
     if (haystack[0].firstChild) { 
      n = haystack[0].firstChild.nodeValue.toUpperCase(); 
     } else { 
      return 0; 
     } 
     for (var i = 0; i < ks.length; i++) { 
      if (n.indexOf(ks[i].firstChild.nodeValue) < 0) { 
       return 0; 
      } 
     } 
     return 1; 
    } 

xml이 검색됩니다. 그것은 첫째 속성 요소의 값 하위 요소에 존재하는 초안을 입력하면

<Diagram ID="49ab6eb5-c51f-4e36-9495-869897ef0d0d"> 
    <CustomAttributes> 
    <Attribute> 
    <Name>Approval Status</Name> 
    <Description>Document/Diagram/Object Approval Status</Description> 
    <Value>Draft - Work in Progress</Value> 
    <Datatype>Text</Datatype> 
</Attribute> 
<Attribute> 
    <Name>Next Document Review Date</Name> 
    <Description>When is this document to be reviewed next?</Description> 
    <Value /> 
    <Datatype>Date</Datatype> 
</Attribute> 
<Attribute> 
    <Name>Stakeholder View</Name> 
    <Description>Select the Stakeholder View</Description> 
    <Value>PMO</Value> 
    <Datatype>Text</Datatype> 
</Attribute> 

현재 XSL

다이어그램에 대한 링크를 렌더링합니다. 그러나 PMO를 검색하면 아무 것도 반환하지 않습니다.

문제는 xsl이 CustomAttribute 요소의 모든 하위 요소를 살펴볼 때 xsl이 첫 번째 Attribute 요소 만 살펴 보는 것입니다.

for-each를 사용하여 xml 트리를 탐색하는 데 어려움이있는 모든 애트리뷰트 요소를 검토하여 다이어그램 조상을 가져 와서 렌더링에 사용할 수 있도록했습니다.

감사합니다.

+0

이 질문은 전적으로 불분명합니다. XSLT 코드가하는 일 (코드의 아주 작은 부분 만 보여주고 있음)을 볼 수 없으며 달성하고자하는 것이 명확하지 않습니다. 또한 JS 코드가 문제와 관련이 있는지 여부는 명확하지 않습니다. 모니터링하고 xslt 질문에 대답하는 사람들이 JS를 잘하는 것을 기대하지 마십시오. JS가 중요하다면 적어도 JS 코드가하는 말을 설명하십시오. 즉, 질문을 다시 작성하십시오. –

+0

나는 당신의 'js : containsKeywords ($ objXML/*/CustomAttributes/Attribute/Value, $ searchKeywords)'함수가 생각처럼 작동하지 않거나, 적어도 내가 보았을 곳이지만 Dimitre 말합니다, 거기에 포함되지 않은 것으로 말할 수있는 방법은 없습니다 – Woody

+0

나는 자바 스크립트를 다시 추가하여 이것이 명확하게 보이거나 오류의 원인을 제거하는 데 도움이되기를 바랍니다. – ywm

답변

0

동일한 작업을 XSLT에서 수행 할 수 있다고 생각합니다. 이 스타일이 적절한 입력을

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="CustomAttributes" name="search"> 
     <xsl:param name="pAttributes" select="Attribute/Value"/> 
     <xsl:param name="pKeywords" select="''"/> 
     <xsl:choose> 
      <xsl:when test="$pKeywords != ''"> 
       <xsl:call-template name="search"> 
        <xsl:with-param name="pAttributes" 
            select="$pAttributes 
                [contains(
                 concat(' ',.,' '), 
                 concat(' ', 
                   substring-before(
                    concat($pKeywords,' '), 
                    ' '), 
                   ' '))]"/> 
        <xsl:with-param name="pKeywords" select="substring-after($pKeywords,' ')"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <found> 
        <xsl:copy-of select="$pAttributes"/> 
       </found> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

: '임시로 설정

<Diagram ID="49ab6eb5-c51f-4e36-9495-869897ef0d0d"> 
    <CustomAttributes> 
     <Attribute> 
      <Name>Approval Status</Name> 
      <Description>Document/Diagram/Object Approval Status</Description> 
      <Value>Draft - Work in Progress</Value> 
      <Datatype>Text</Datatype> 
     </Attribute> 
     <Attribute> 
      <Name>Next Document Review Date</Name> 
      <Description>When is this document to be reviewed next?</Description> 
      <Value /> 
      <Datatype>Date</Datatype> 
     </Attribute> 
     <Attribute> 
      <Name>Stakeholder View</Name> 
      <Description>Select the Stakeholder View</Description> 
      <Value>PMO</Value> 
      <Datatype>Text</Datatype> 
     </Attribute> 
    </CustomAttributes> 
</Diagram> 

엉 PARAM pKeywords 기본값 출력 :

<found> 
    <Value>Draft - Work in Progress</Value> 
</found> 

참고 : PARAM pKeywords이 때 설정되지 않거나 빈 문자열 ''이 모든 노드 집합을 매개 변수 pAttributes, s에 설정하면 출력됩니다. o이 템플릿을 필터로 생각할 수 있습니다. 또한 출력을 편집하여 로직에 유용하게 만들 수 있습니다. 예를 들어 비어 있지 않은 경우 pAttributes의 테스트 값을 출력하고이 템플릿을 호출하는 내용으로 변수를 선언하고이 변수의 문자열 값을 테스트 한 다음 스타일 시트 조각과 같이 템플릿을 적용하십시오.

+0

코드를 사용하여 어떻게 루트 노드를 반환 할 수 있습니까? 다이어그램은 별도의 XML 파일에 분산되어 있으며 xsl은 각 파일을 검색 한 다음 현재 xml 파일을 렌더링 템플리트로 보냅니다. – ywm

+0

@ywm :이 명명 된 템플릿은 확장 기능의 XSLT 구현입니다 (확장이 느리면 스크립트 엔진이 모든 호출과 함께로드됩니다). 검색 할 노드 집합 (param'pAttributes')과 공백으로 분리 된 키워드 목록 (param'pKeywords')을 전달할 수 있습니다. 출력은 변수에 "저장"하는'test = "js : containsKeywords (...')에서와 같이 테스트 용 더미 문자열 일 수 있습니다. –

0

그래, 문제가 무엇인지 알아 냈어.

다음은 무슨 일이 일어나고 있는지 설명하기위한 해결책입니다.

<xsl:when test="$searchDescription"> 
        <xsl:if test="js:containsKeywords($objXML/*/Properties/Description, $searchKeywords)"> 
         <xsl:apply-templates mode="render" select="."> 
          <xsl:with-param name="fullXML" select="$objXML" /> 
         </xsl:apply-templates> 
        </xsl:if> 
       </xsl:when> 
       <xsl:when test="$searchAttributes"> 
        <xsl:variable name="source" select="."></xsl:variable> 
        <xsl:if test="name() != 'Folder'"> 
         <xsl:for-each select="$objXML/*/CustomAttributes//Attribute"> 
          <xsl:if test="js:containsKeywords(./Value,$searchKeywords)"> 
           <xsl:apply-templates mode="render" select="$source"> 
            <xsl:with-param name="fullXML" select="$objXML" /> 
           </xsl:apply-templates> 
          </xsl:if> 
         </xsl:for-each> 
        </xsl:if> 
       </xsl:when> 

이 스 니펫은 검색 대상에 대해 다른 모든 XML 파일에 적용되는 템플릿의 일부입니다.

설명 검색에서 무언가가 발견되면 게시 노드가 렌더링에 사용되도록 선택됩니다. 설명 검색과 동일한 기능을하는 여러 개의 속성 노드가 있으므로 첫 번째 Attribute 요소 만 검색합니다. for-each를 사용하면 모든 속성을 거치지 만 검색되는 xml 파일로 컨텍스트가 변경됩니다.

올바른 비트를 렌더링 템플릿에 보내려면 소스 변수에 for-each 앞에 컨텍스트를 저장했는데 일치하는 항목을 찾으면 렌더링 대신 소스 변수를 보냅니다.

관련 문제