2017-01-23 3 views
1

특정 노드 (EN_PLAN_NAME)의 텍스트를 문자열 목록과 비교하여 해당 문자열 중 하나와 일치하는 텍스트가 포함 된 노드 만 출력 할 수 있습니다.XSLT 1.0 외부 매개 변수 노드 집합에 포함 사용 사용

How to compare against multiple strings in xslt

입력 XML

<EligibilityRecords xmlns="http://CDHC_Eligibility_LSDD"> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>Health Savings Account</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>zzHealth Reimbursement Arrangement</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>Health Reimbursement Arrangement 233</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>HRA</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>BASE HRA</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>FSA</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
</EligibilityRecords> 

예상 출력의 XML

<EligibilityRecords xmlns="CDHC_Eligibility_LSDD_Internal"> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>zzHealth Reimbursement Arrangement</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>Health Reimbursement Arrangement 233</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>HRA</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
    <Eligibility_Detail_Record xmlns=""> 
    <EN_PLAN_NAME>BASE HRA</EN_PLAN_NAME> 
    <EN_MBRSHP_EFF_STRT_DT>01012017</EN_MBRSHP_EFF_STRT_DT> 
    </Eligibility_Detail_Record> 
</EligibilityRecords> 

XSLT

:이 비슷한 질문에서 답을 사용하여 시도
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
       xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" 
       exclude-result-prefixes="msxsl var s0 ns0" version="1.0" 
       xmlns:s0="CDHC_Eligibility_LSDD" 
       xmlns:ns0="CDHC_Eligibility_LSDD_Internal"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 

    <xsl:param name="HRAPlanNames"> 
     <PlanName>Health Reimbursement Arrangement</PlanName> 
     <PlanName>HRA</PlanName> 
    </xsl:param> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
    <ns0:EligibilityRecords> 
     <xsl:for-each select="Eligibility_Detail_Record"> 
     <xsl:if test="contains(EN_PLAN_NAME,msxsl:node-set($HRAPlanNames)/*)"> 
      <Eligibility_Detail_Record> 
      <xsl:copy-of select="EN_PLAN_NAME"/> 
      </Eligibility_Detail_Record> 
     </xsl:if> 
     </xsl:for-each> 
    </ns0:EligibilityRecords> 
    </xsl:template> 
</xsl:stylesheet> 

XSLT 텍스트 함유 「건강 보상 배열 "을 갖지만 출력"HRA "를 포함하는 모든 노드를하지 않는 EN_PLAN_NAME 출력한다. 내가 뭘 잘못하고 있는지 모르겠다.

답변

0

참고 : 두 예제 모두에서 translate()을 사용할 수 있습니다. 수정하기 전에 질문의 입력 내용을 복사했습니다.

지금은 msxsl을 테스트하지만,이 시도 할 수 없습니다 문제가 해결되지 않으면

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" 
    exclude-result-prefixes="msxsl var s0 ns0" version="1.0" 
    xmlns:s0="CDHC_Eligibility_LSDD" 
    xmlns:ns0="CDHC_Eligibility_LSDD_Internal"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 

    <xsl:param name="HRAPlanNames"> 
    <PlanName>HEALTH REIMBURSEMENT ARRANGEMENT</PlanName> 
    <PlanName>HRA</PlanName> 
    </xsl:param> 

    <xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable> 
    <xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> 

    <xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:for-each select="Eligibility_Detail_Record"> 
     <xsl:variable name="pn" select="translate(EN_PLAN_NAME,$lowercase,$uppercase)"/> 
     <xsl:if test="msxsl:node-set($HRAPlanNames)/*[contains($pn,normalize-space())]"> 
      <Eligibility_Detail_Record> 
      <xsl:copy-of select="EN_PLAN_NAME"/> 
      </Eligibility_Detail_Record> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

을, 당신은 (사용하지 않을 계획 이름은 하드 XSLT 코딩해도 상관없는

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:var="http://schemas.microsoft.com/BizTalk/2003/var" 
    exclude-result-prefixes="msxsl var s0 ns0 local" version="1.0" 
    xmlns:s0="CDHC_Eligibility_LSDD" 
    xmlns:ns0="CDHC_Eligibility_LSDD_Internal" 
    xmlns:local="local"> 
    <xsl:output omit-xml-declaration="yes" method="xml" version="1.0" /> 

    <local:HRAPlanNames> 
    <local:PlanName>HEALTH REIMBURSEMENT ARRANGEMENT</local:PlanName> 
    <local:PlanName>HRA</local:PlanName> 
    </local:HRAPlanNames> 

    <xsl:variable name="planNames" 
    select="document('')/xsl:stylesheet/local:HRAPlanNames/local:PlanName"/> 

    <xsl:variable name="lowercase">abcdefghijklmnopqrstuvwxyz</xsl:variable> 
    <xsl:variable name="uppercase">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable> 

    <xsl:template match="/*"> 
    <xsl:copy> 
     <xsl:for-each select="Eligibility_Detail_Record"> 
     <xsl:variable name="pn" select="translate(EN_PLAN_NAME,$lowercase,$uppercase)"/> 
     <xsl:if test="$planNames[contains($pn,normalize-space())]"> 
      <Eligibility_Detail_Record> 
      <xsl:copy-of select="EN_PLAN_NAME"/> 
      </Eligibility_Detail_Record> 
     </xsl:if> 
     </xsl:for-each> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
0

contains() 기능의 두 인수의 유형 문자열해야합니다 : xsl:param), node-set()를 사용하지 않는 것을 시도. 노드 집합을 두 번째 인수로 사용하려고 시도하면 (XSLT 1.0에서는) 노드 집합의 첫 번째 노드 만 고려됩니다. 예상 된 결과를 얻기 위해

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
exclude-result-prefixes="msxsl" > 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="HRAPlanNames"> 
     <PlanName>Health Reimbursement Arrangement</PlanName> 
     <PlanName>HRA</PlanName> 
</xsl:param> 

<xsl:template match="/*"> 
    <EligibilityRecords xmlns="CDHC_Eligibility_LSDD_Internal"> 
     <xsl:for-each select="Eligibility_Detail_Record"> 
      <xsl:variable name="plan-name" select="EN_PLAN_NAME" /> 
      <xsl:variable name="test"> 
       <xsl:for-each select="msxsl:node-set($HRAPlanNames)/PlanName"> 
        <xsl:if test="contains($plan-name, .)">Y</xsl:if> 
       </xsl:for-each> 
      </xsl:variable> 
      <xsl:if test="string($test)"> 
       <xsl:copy-of select="."/> 
      </xsl:if> 
     </xsl:for-each> 
    </EligibilityRecords> 
</xsl:template> 

</xsl:stylesheet> 

: 당신이 HRAPlanNames 매개 변수의 현재 구조를 유지하려면

, 당신은 뭔가를 할 필요가있을 것이다.