문제

XHTML을 생성하는 XSLT 1.0 (2.0은 옵션이 아닙니다) 스타일 시트를 가지고 있습니다. 매개 변수에 따라 전체 XHTML 유효한 문서를 생성하거나 <div>...</div> 웹 페이지에 포함시키기위한 스 니펫.

내 문제는이 두 경우에 다른 XML 선언을 생성하는 것입니다. 독립형 페이지의 경우 다음이 필요합니다.

<xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
       doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

그리고 <div> 하나:

<xsl:output omit-xml-declaration="yes"/>

하지만 <xsl:output> 에 포함될 수 없습니다 <xsl:if>. 그것은 단지 될 수 있습니다 직접 의 아이 <xsl:stylesheet>.

내가 보는 유일한 해결책은 대부분의 템플릿과 함께 스타일 시트를 만들고 오른쪽으로 두 개의 작은 "포장지"를 만드는 것입니다. <xsl:output> 그리고 어느 것입니다 <xsl:import> 메인 스타일 시트.

나는 더 나은 아이디어를 찾고 있었지만 분명히 아무것도 없습니다. Andrew Hare와 Jelovirt의 조언에 따라 나는 두 개의 "드라이버"를 썼습니다. <xsl:output> 그리고 메인 스타일 시트. 다음은 이러한 드라이버 중 하나입니다. 독립형 HTML 용 드라이버는 다음과 같습니다.

<?xml version="1.0" encoding="us-ascii"?>
<!-- This file is intended to be used as the main stylesheet, it creates a 
 standalone Web page. 
-->
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">

  <xsl:import href="traceroute2html.xsl"/>

  <xsl:param name="standalone" select="'true'"/>

  <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
      doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>

</xsl:stylesheet>
도움이 되었습니까?

해결책

필요한 것은 두 개의 다른 스타일 시트 인 것 같습니다. 가능하다면 두 개의 개별 스타일 시트를 만들고 코드에서 필요한 것을 동적으로 호출해야합니다.

다른 팁

최근에 고용해야했던 또 다른 옵션은 다음과 같습니다.

  1. 모든 경우에 XML 선언을 생략하십시오.
  2. 조건부로 선언을 출력하십시오 에스카로운 텍스트로.

파일에 출력하는 경우 XSLT 1.0 및 2.0에서만 작동합니다. 변수에 저장할 때와 같은 동일한 패스에서 출력을 XML로 처리 해야하는 경우 작동하지 않습니다.

(XSLT 2.0 확장 기능은이 출력을 한 번에 XML로 취급 할 수 있으며 XSLT 3.0은 XML로 입력 문자열을 구문 분석하는 내장 기능이 있습니다.)

예제 스 니펫 :

<!-- Omit the XML declaration as the base case:
    we can conditionally output a declaration 
    as text, but we *cannot* apply conditions on
    this `omit-xml-declaration` attribute here.  -->
<xsl:output method="xml" indent="no" 
    omit-xml-declaration="yes"
/>

<!-- Root element match: evaluate different cases, output XML declaration,
    XHTML DOCTYPE, or something else, then process the rest of the input. -->
<xsl:template match="/">
    <xsl:choose>
        <xsl:when test="'... some condition ...'">
            <xsl:text disable-output-escaping="yes">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</xsl:text>
        </xsl:when>
        <xsl:when test="'... some other condition ...'">
            <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
            <!-- ... some third kind of output ... -->
        </xsl:otherwise>
    </xsl:choose>
    <!-- Just process the rest -->
    <xsl:apply-templates/>
</xsl:template>


... [ other code ] ...

xslt에서 값 omit-xml-declaration 둘 중 하나 여야합니다 yes 또는 no, 속성 값 템플릿을 사용할 수 없습니다. 이것은 1.0과 2.0에 모두 적용됩니다.

DocType 속성은 AVT를 사용할 수 있지만 문제는 속성을 생략 할 수 없으며 빈 속성 만 출력 할 수 있으며 비어있는 DocType 문자열이있는 출력으로 이어집니다.

죄송합니다. XSLT로 할 수 없습니다. 두 개의 다른 스타일 시트를 사용하거나 XSLT 프로세서를 호출하는 코드에서 출력 매개 변수를 설정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top