2012-05-20 1 views
3

다른 XML 문서의 데이터를 필터링하는 데 도움이되는 문서를 작성하려고합니다. 예 :사용자 지정 마크 업 언어를 사용하여 XML 데이터 필터링

<document> 
    <filter> 
     <what> 
      <include> 
       <marital_staus/> 
       <ms>single</ms> <!--nog = no of groups--> 
       <include> 
        <memberofgroups/> 
        <gn>Football club</gn> <!--user is a member of this club--> 
       </include> 
      </include> 
     </what> 
    </filter> 

    <users> 
      <user> 
       <name> 
        <first>abc</first> 
        <last>xyz</last> 
       </name> 
       <dob>12/02/1987</dob> 
       <marital_status>married</marital_status> 
       <groups> 
        <member_of_group>Chess Club</member_of_group> 
        <member_of_group>Football club</member_of_group> 
       </groups> 
      </user> 

      <user> 
       <name> 
        <first>aaa</first> 
        <last>bbb</last> 
       </name> 
       <dob>14/03/1987</dob> 
       <marital_status>single</marital_status> 
       <groups> 
        <member_of_group>Chess Club</member_of_group> 
        <member_of_group>Football club</member_of_group> 
       </groups> 
      </user> 

      <user> 
       <name> 
        <first>fff</first> 
        <last>nnn</last> 
       </name> 
       <dob>12/6/1983</dob> 
       <marital_status>single</marital_status> 
       <groups> 
        <member_of_group>Chess Club</member_of_group> 
        <member_of_group>Cultural Association</member_of_group> 
       </groups> 
      </user> 
    </users> 
</document> 

내가 할 수있는이 코드를 먼저 선택하는 것입니다 원하는 것은, 축구 클럽 회원, 그리고 그 밖에있는 사용자는 단일있는 사용자를 선택했다. 하지만이 스타일 시트를 작성하는 방법을 알아낼 수 없습니다. 나는 이것을 썼다 :

<xsl:template name="temp"> 
     <xsl:param name="a1"/> 
     <xsl:param name="pro"/> 
     <xsl:choose> 
      <xsl:when test="$pro = 'marital_status'"> 
       <xsl:for-each select="/document/users/user"> 
        <xsl:if test="marital_status=$a1"> 
         <xsl:value-of select="."/> 
        </xsl:if>     
       </xsl:for-each> 
      </xsl:when> 
      <xsl:when test="$pro = 'memberofgroups'"> 
      <xsl:for-each select="/document/users/user"> 
       <xsl:for-each select="./groups/member_of_group"> 
        <xsl:if test=".=$a1"> 
         <xsl:value-of select="."/> 
        </xsl:if> 
       </xsl:for-each> 
      </xsl:for-each> 
     </xsl:when> 
     </xsl:choose> 
    </xsl:template> 
<xsl:template match="include"> 
     <xsl:call-template name="temp"> 
      <xsl:with-param name="a1"> 
       <xsl:apply-templates select="*[2]"/> 
      </xsl:with-param> 
     </xsl:call-template> 
    </xsl:template> 

나는이 가정에서 올바른 값을 전달한다.

문제는 내가 독신 인 모든 사용자와 해당 특정 그룹의 구성원 인 모든 사용자를 얻습니다. 그러나 나는 또한 풋볼 클럽의 일원 인 단일 사용자를 원합니다. 스타일 시트를 하드 코딩하지 않기를 바랍니다. 왜냐하면 다른 요소를 기반으로 필터링을 수행하기를 원하기 때문입니다.

필터링 된 요소를 다음 XPath 표현식의 입력으로 사용할 수있는 방법으로 저장하는 방법을 알 수 없습니다. 또는 문서를 필터링하기위한 제약 조건을 작성하는 동안 실수를 저지르고 있습니다. 아니면 필터링을 위해 문서를 작성하는 다른 적절한 방법이있을 수 있습니까? 나는 너의 도움에 많이 감사 할 것이다.

+0

이러한 템플릿을 호출하는 다른 언어를 사용하고 있습니까? –

+0

아니요 ... 나는 xslt만을 사용하고 있습니다 ... 그리고 두 개의 요소 "필터"두 번째 "사용자"가있는 하나의 XML 문서가 있습니다 ... 사용자는 이름, dob 등의 일부 데이터 요소가 있습니다. 이 스타일 시트 또는 다른 적절한 태그를 사용하여 사용자 요소의 데이터를 필터링하는 필터 요소 – ashamim

+0

소스 XML 문서를 제공하는 것을 잊었습니다. 질문을 편집하고 중요한 정보를 제공해주십시오. –

답변

1

사용 :

/*/*/user 
    [*[name() = name(/*/filter/*/include/*[1])] 
    = 
     /*/filter/*/include/*[2] 
    and 
     groups/*[name() = name(/*/filter/*/include/include/*[1])] 
    = 
     /*/filter/*/include/include/*[2] 
    ] 

XSLT - 기반의 검증이 변환이 제공된 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:template match="/"> 
    <xsl:copy-of select= 
     "/*/*/user 
     [*[name() = name(/*/filter/*/include/*[1])] 
     = 
      /*/filter/*/include/*[2] 
     and 
      groups/*[name() = name(/*/filter/*/include/include/*[1])] 
     = 
      /*/filter/*/include/include/*[2] 
     ] 
"/> 
</xsl:template> 
</xsl:stylesheet> 

(약간의 오타가 수정) :

<document> 
    <filter> 
     <what> 
      <include> 
       <marital_status/> 
       <ms>single</ms> 
       <!--nog = no of groups--> 
       <include> 
        <member_of_group/> 
        <gn>Football club</gn> 
        <!--user is a member of this club--> 
       </include> 
      </include> 
     </what> 
    </filter> 
    <users> 
     <user> 
      <name> 
       <first>abc</first> 
       <last>xyz</last> 
      </name> 
      <dob>12/02/1987</dob> 
      <marital_status>married</marital_status> 
      <groups> 
       <member_of_group>Chess Club</member_of_group> 
       <member_of_group>Football club</member_of_group> 
      </groups> 
     </user> 
     <user> 
      <name> 
       <first>aaa</first> 
       <last>bbb</last> 
      </name> 
      <dob>14/03/1987</dob> 
      <marital_status>single</marital_status> 
      <groups> 
       <member_of_group>Chess Club</member_of_group> 
       <member_of_group>Football club</member_of_group> 
      </groups> 
     </user> 
     <user> 
      <name> 
       <first>fff</first> 
       <last>nnn</last> 
      </name> 
      <dob>12/6/1983</dob> 
      <marital_status>single</marital_status> 
      <groups> 
       <member_of_group>Chess Club</member_of_group> 
       <member_of_group>Cultural Association</member_of_group> 
      </groups> 
     </user> 
    </users> 
</document> 

위의 XPath 식을 평가하고 (이 경우 단지 하나의 노드) 선택된 노드는 출력에 복사됩니다

<user> 
    <name> 
     <first>aaa</first> 
     <last>bbb</last> 
    </name> 
    <dob>14/03/1987</dob> 
    <marital_status>single</marital_status> 
    <groups> 
     <member_of_group>Chess Club</member_of_group> 
     <member_of_group>Football club</member_of_group> 
    </groups> 
</user> 
+0

이 스타일 시트 구조를 독립적으로 만들 수있는 방법이 있을까요? 예 :나는 하나의 축구 클럽 <결혼 _ 여부 /> 처럼 내 필터링 제약 조건을 작성하는 경우 나는 위치를 변경함에 따라 이 스타일 시트는 n 개의 태그로 구성됩니다. ot work 또는 필터링에 대한 제약 조건을 변경해야한다고 생각하십니까? – ashamim

+0

@ashamim :'groups' 요소를 제거하면 훨씬 쉽게 선택 될 것입니다. 이것은 검색 할 내용과 동일한 XML 문서에 "필터"를 포함하는 것이 의미가 없다는 의미입니다. –

+0

이 필터 요소를 다양한 유사한 문서에 대해 별도로 사용할 계획입니다. 지금은 동일한 XML 문서에서 다른 필터링 제약 조건을 성공적으로 적용 할 수 있는지 확인하는 데 사용하고 있습니다. – ashamim

관련 문제