2017-04-03 1 views
0

도움을 찾고 계십니다. XFA 양식 (XML 기반)을 사용하여 항목을 표시하고 값을 저장하는 드롭 다운이 있습니다. 목록이 매우 길 수 있으므로 XSLT 1.0을 사용하여 필터링하려고합니다.XSLT 1.0을 사용하여 두 xml 트리를 동시에 필터링하는 방법은 무엇입니까?

소스 XML의 DROM의 메뉴는 다음과 같이 보일 수 있습니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xfa="http://www.xfa.org/schema/xfa-form/2.8/" xml:space="preserve"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no" standalone="yes"/> 
    <xsl:template match="/"> 
     <field name="DropDownList"> 
      <xsl:apply-templates/> 
     </field> 
    </xsl:template> 
    <xsl:template match="/*[local-name()='field']/*[local-name()='items']" > 
     <items xmlns="http://www.xfa.org/schema/xfa-template/3.6/"> 
      <xsl:for-each select="./*[local-name()='text']"> 
       <xsl:if test="contains(., '01')"> 
        <text> 
         <xsl:value-of select="."/> 
        </text> 
       </xsl:if> 
      </xsl:for-each> 
     </items> 
    </xsl:template> 
</xsl:stylesheet> 

내가 필요하면 다시로드 이전과 같은 XML 구조는 다음과 같습니다

<?xml version="1.0" encoding="UTF-8"?> 
<field name="DropDownList" xmlns="http://www.xfa.org/schema/xfa-form/2.8/"> 
    <!-- Displayed items to be filtered --> 
    <items xmlns="http://www.xfa.org/schema/xfa-template/3.6/"> 
     <text>Lorem Ipsum 0030</text> 
     <text>Lorem Ipsum 0060</text> 
     <text>Lorem Ipsum 0070</text> 
     <text>Lorem Ipsum 0080</text> 
     <text>Lorem Ipsum 0100</text> 
     <text>Lorem Ipsum 0110</text> 
     <text>Lorem Ipsum 0120</text> 
     <text>Lorem Ipsum 0130</text> 
     <text>Lorem Ipsum 0140</text> 
    </items> 
    <!-- Hidden save items to be filtered too --> 
    <items save="1" presence="hidden" xmlns="http://www.xfa.org/schema/xfa-template/3.6/"> 
     <text>item0</text> 
     <text>item1</text> 
     <text>item2</text> 
     <text>item3</text> 
     <text>item4</text> 
     <text>item5</text> 
     <text>item6</text> 
     <text>item7</text> 
     <text>item8</text> 
     <text>item9</text> 
    </items> 
</field> 

나의 현재 스타일이 방법을 찾습니다 드롭 다운 목록에 넣지 만, 아직 정확한 데이터로 채워진 두 번째 항목 트리를 얻는 방법을 찾지 못했습니다. 첫 번째 항목 트리에서 노드의 인덱스를 저장하고 두 번째 항목 트리에서 관련 노드를 찾으려면 매개 변수 또는 변수를 사용하는 것이 좋습니다.하지만 어떻게해야합니까?

<?xml version="1.0" encoding="UTF-8"?> 
<field name="DropDownList" xmlns="http://www.xfa.org/schema/xfa-form/2.8/"> 
    <items xmlns="http://www.xfa.org/schema/xfa-template/3.6/"> 
     <text>Lorem Ipsum 0100</text> 
     <text>Lorem Ipsum 0110</text> 
     <text>Lorem Ipsum 0120</text> 
     <text>Lorem Ipsum 0130</text> 
     <text>Lorem Ipsum 0140</text> 
    </items> 
    <items save="1" presence="hidden" xmlns="http://www.xfa.org/schema/xfa-template/3.6/"> 
     <text>item5</text> 
     <text>item6</text> 
     <text>item7</text> 
     <text>item8</text> 
     <text>item9</text> 
    </items> 
</field> 

답변

1

쉬운 방법은 템플릿 및 적용 템플릿에서 모드를 사용하는 것입니다. 따라서 apply-templates에 mode 속성을 추가하십시오. 또한 apply-templates를 사용하여 대상으로 지정하는 템플리트에 동일한 이름의 mode 속성을 추가하십시오. 그런 다음 두 번째 출력에 대해 다른 모드를 사용하거나 모드없이 흐름을 보냅니다.

0

입력 해 주셔서 감사합니다. arleady가 찾고있는 스타일 시트를 또 만들었습니다. 그러나, 나는 ... 나는이 이상적 때문에이 솔루션은 두 번 첫 번째 항목 트리에서 모든 노드를 확인하는 것을 내 눈에서 성능 지연이 발생

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xfa="http://www.xfa.org/schema/xfa-form/2.8/" xml:space="preserve"> 
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" standalone="yes"/> 
    <xsl:variable name="filterText" select="01"/> 
    <!--Filter display items--> 
    <xsl:template match="//*[local-name()='items'][1]/*[local-name()='text']" mode="filterDisplayItems"> 
     <xsl:if test="contains(., $filterText)"> 
      <xsl:copy-of select="."/> 
     </xsl:if> 
    </xsl:template> 
    <!--Filter save items--> 
    <xsl:template match="//*[local-name()='items'][1]/*[local-name()='text']" mode="filterSaveItems"> 
     <xsl:param name="nodeIndex" select="position()"/> 
     <xsl:if test="contains(., $filterText)"> 
      <xsl:copy-of select="//*[local-name()='items'][2]/*[local-name()='text'][$nodeIndex]"/> 
     </xsl:if> 
    </xsl:template> 
    <xsl:template match="/"> 
     <field name="ListBackup"> 
      <!--Create filtered list of display items--> 
      <items xmlns="http://www.xfa.org/schema/xfa-template/3.6/"> 
       <xsl:apply-templates select="//*[local-name()='items'][1]/*[local-name()='text']" mode="filterDisplayItems"/> 
      </items> 
      <!--Create filtered list of save items--> 
      <items save="1" presence="hidden" xmlns="http://www.xfa.org/schema/xfa-template/3.6/"> 
       <xsl:apply-templates select="//*[local-name()='items'][1]/*[local-name()='text']" mode="filterSaveItems"/> 
      </items> 
     </field> 
    </xsl:template> 
</xsl:stylesheet> 

을 ... 생각하지 않습니다. 더 좋은 방법이 있어야합니다. 첫 번째 항목 트리를 필터링하는 템플릿이 일치하는 항목을 찾으면 ... select = "position()"을 사용하여 색인을 쉽게 얻을 수 있습니다. 이것은 두 번째 항목 트리를 필터링하는 템플릿으로 전달되어야합니다. 거기서 인덱스만으로 노드를 복사하면됩니다. 이 아이디어를 어떻게 반전시킬 수 있습니까?

관련 문제