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 요소간에 차이가 있는지 궁금해 할 때이를 언급합니다.
Dr. Kay. 귀하의 설명을 기반으로, 나는 내 코드에서 터널 매개 변수를 재 선언하는 비용이 적어야한다고 예상합니다. – dave
그것을 측정하고 결과를 공유하십시오. –