2017-04-21 16 views
0

Saxon XSLT 파서가 터널 매개 변수 전달을 최적화하면 궁금합니다. 같은 값을 사용하면 다시 생성됩니까? 또는 현재 사본을 사용합니까?Saxon XSLT 프로세서는 터널 매개 변수를 현재 값으로 설정하는 데 최적화되어 있습니까?

예제를 제공 할 필요는 없지만 아래의 특정 사례를 설명하려고했습니다.

예시 입력 XML :

<formDefinition sysid="1"> 
    <subform sysid="2"> 
     <subform layoutGrid="8" sysid="3"> 
      <field weight="2" sysid="4"> 
       <bind match="none" /> 
       <type><date /></type> 
      </field> 
     </subform> 
    </subform> 
</formDefinition> 

일부 컨텍스트 제공하는데 - 하위 요소는 HTML DIV 소자 유사하고, 전계 요소는 HTML 입력 요소와 유사하다. layoutGrid 속성은 하위 양식에 의해 설정되거나 재정의 될 수 있으며 필드와 같은 하위 항목에서 사용됩니다.

내 실제 스타일 시트와 'formDefinition'은 많은 터널 매개 변수를 사용하여 분할하기 어려운 많은 상호 관련 설정을 사용하므로 훨씬 크기가 커서 매개 변수를 기존 값으로 재설정하는 것을 피하기 어렵습니다.

터널 매개 변수 중 하나만 설정하는 방법을 설명하기 위해 일반적인 흐름을 보여 드리려고했습니다.

예 스타일 시트 -

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

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

<xsl:template match="*[@sysid]"> 
    <xsl:apply-templates select="." mode="render" /> 
</xsl:template> 

<xsl:template match="/formDefinition" mode="render"> 
    <xsl:copy> 
     <xsl:next-match /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="subform" mode="render"> 
    <xsl:param name="pLayoutGrid" as="xs:decimal" tunnel="yes" /> 
    <xsl:copy> 
     <xsl:attribute name="effLayoutGrid" select="$pLayoutGrid" /> 
     <xsl:next-match /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="field" mode="render"> 
    <xsl:param name="pLayoutGrid" as="xs:decimal" tunnel="yes" /> 
    <xsl:copy> 
     <xsl:attribute name="effLayoutGrid" select="$pLayoutGrid" /> 
     <xsl:next-match /> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*" mode="render"> 
    <xsl:apply-templates select="*[not(@sysid)]" /> 
    <xsl:call-template name="step" /> 
</xsl:template> 

<xsl:template name="step"> 
    <xsl:apply-templates select="*[@sysid]"> 
     <xsl:with-param name="pLayoutGrid" as="xs:decimal" tunnel="yes"> 
      <xsl:apply-templates select="." mode="layoutGrid" /> 
     </xsl:with-param> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="/formDefinition" mode="layoutGrid"> 
    <xsl:sequence select="xs:decimal(12)" /> 
</xsl:template> 

<xsl:template match="subform" mode="layoutGrid"> 
    <xsl:param name="pLayoutGrid" as="xs:decimal" tunnel="yes" /> 
    <!-- potentially resetting the same value here --> 
    <xsl:sequence select="(@layoutGrid, $pLayoutGrid)[1]" /> 
</xsl:template> 

<xsl:template match="field" mode="layoutGrid"> 
    <xsl:param name="pLayoutGrid" as="xs:decimal" tunnel="yes" /> 
    <!-- setting value to current value --> 
    <xsl:sequence select="$pLayoutGrid" /> 
</xsl:template> 

</xsl:stylesheet> 

출력 :

<formDefinition> 
    <subform effLayoutGrid="12"> 
     <subform effLayoutGrid="12"> 
      <field effLayoutGrid="8"> 
       <bind match="none" /> 
       <type> 
        <date /> 
       </type> 
      </field> 
     </subform> 
    </subform> 
</formDefinition> 

내 질문 예제의 맥락에서 - pLayoutGrid 터널 매개 변수가 실제로 새로운 '객체'를 만들 재설정하거나 재사용하지 않습니다 값이 현재 값으로 다시 설정되면 현재 값?

전체 코드에는 xml 요소/트리 인 터널 매개 변수도 있습니다. '기본'유형과 xml 요소간에 차이가 있는지 궁금해 할 때이를 언급합니다.

답변

2

Saxon이 템플릿을 호출 할 때 먼저 새 XPathContext 객체를 만듭니다. 이것은 XPath 및 XSLT 사양에 정의 된 "동적 컨텍스트"에 해당합니다 (현재 날짜/시간과 같이 실행 범위 내에서 변경되지 않는 부분은 제외). 새로운 XPathContext 객체는 호출자의 컨텍스트의 일부 측면을 복사하고 다른 부분 (예 : 로컬 변수)을 다시 초기화합니다.

XPathContext 개체는 값이 ParameterSet 인 tunnelParams라는 필드를 보유합니다. 이것은 HashMap과 같은 이름/값 쌍의 집합입니다. 템플릿이 호출되면 호출자가 전달한 ParameterSet의 항목과 호출 수신자가 선언 한 새 터널 매개 변수의 합집합을 포함하는 새로운 ParameterSet 객체가 만들어집니다. ParameterSet의 항목은 복사되지만 모든 XDM 값이 변경되지 않으므로 값 자체는 복사 할 필요가 없습니다.

귀하의 질문이 무엇을 의미하는지 정확히 이해하는 데 어려움이 있습니다. 터널 매개 변수를 기존 값 (예 : 전역 변수의 값)으로 "재설정"하면 ParameterSet은 해당 값에 대한 참조 만 포함하게됩니다.

<xsl:with-param name="tun-par" select="23 to 50"/> 

과 같이 일부 계산을 사용하여 설정하면 새 값이 이전 값과 동일하다는 것을 인식하지 못합니다.

+0

Dr. Kay. 귀하의 설명을 기반으로, 나는 내 코드에서 터널 매개 변수를 재 선언하는 비용이 적어야한다고 예상합니다. – dave

+0

그것을 측정하고 결과를 공유하십시오. –