문제

몇 가지 XML 파일이 있는데 이름은 다른 XML 파일에 저장됩니다.

XSL을 사용하여 XML 파일의 조합 요약을 생성하고 싶습니다. MSXML 확장 기능을 사용 하여이 작업을 수행하는 방법이 있다는 것을 기억합니다 (MSXML을 사용하고 있습니다).

나는 각 파일의 내용을 사용하여 얻을 수 있다는 것을 알고 있습니다. select="document(filename)" 그러나이 모든 문서를 하나로 결합하는 방법을 잘 모르겠습니다.

21-OCT-08 결합 된 XML에서 추가 처리를하고 싶다고 언급 했어야하므로 변환에서 출력하는 것만으로는 충분하지 않으므로 변수로 설정된 노드로 저장해야합니다.

도움이 되었습니까?

해결책

여기에 당신의 작은 예가 있습니다 ~할 수 있었다 하다:

file1.xml :

<foo>
<bar>Text from file1</bar>
</foo>

file2.xml :

<foo>
<bar>Text from file2</bar>
</foo>

index.xml :

<index>
<filename>file1.xml</filename>
<filename>file2.xml</filename>

요약 .xsl :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:exsl="http://exslt.org/common"
    extension-element-prefixes="exsl">

  <xsl:variable name="big-doc-rtf">
      <xsl:for-each select="/index/filename">
        <xsl:copy-of select="document(.)"/>
      </xsl:for-each>
  </xsl:variable>

  <xsl:variable name="big-doc" select="exsl:node-set($big-doc-rtf)"/>

  <xsl:template match="/">
    <xsl:element name="summary">
      <xsl:apply-templates select="$big-doc/foo"/>
    </xsl:element>  
  </xsl:template>

  <xsl:template match="foo">
    <xsl:element name="text">
      <xsl:value-of select="bar"/>
    </xsl:element>  
  </xsl:template>

</xsl:stylesheet>

스타일 시트를 적용합니다 index.xml 당신에게 :

<?xml version="1.0" encoding="UTF-8"?><summary><text>Text from file1</text><text>Text from file2</text></summary>

트릭은 문서 함수 (거의 모든 XSLT 1.0 프로세서에서 지원하는 확장 기능)와 함께 다른 문서를로드하여 변수의 일부로 내용을 출력 한 다음 변수를 추가 처리를 위해 노드 세트로 변환하는 것입니다.

다른 팁

다음과 같은 파일에 파일 이름이 나열되어 있다고 가정합니다.

<files>
    <file>a.xml</file>
    <file>b.xml</file>
</files>

그런 다음 위 파일에서 이와 같은 스타일 시트를 사용할 수 있습니다.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="files/file"/>                          
        </root>
    </xsl:template>

    <xsl:template match="file">
        <xsl:copy-of select="document(.)"/>
    </xsl:template>
</xsl:stylesheet>

살펴보십시오 document() 기능 문서.

당신이 사용할 수있는 document() 변환 과정에서 추가 XML 문서를로드합니다. 노드 세트로로드됩니다. 즉, XSLT에로드 할 파일 이름이 포함 된 XML을 처음에 공급하고 거기에서 가져옵니다.

<xsl:copy-of select="document(@href)/"/>

모든 답변에 감사드립니다. 다음은 MSXML과 함께 사용하는 솔루션의 내장입니다.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ms="urn:schemas-microsoft-com:xslt">
  <xsl:output method="xml"/>
  <xsl:template match="/">
    <xsl:variable name="combined">
      <xsl:apply-templates select="files"/>
    </xsl:variable>
    <xsl:copy-of select="ms:node-set($combined)"/>
  </xsl:template>
  <xsl:template match="files">
    <multifile>
      <xsl:apply-templates select="file"/>
    </multifile>
  </xsl:template>
  <xsl:template match="file">
    <xsl:copy-of select="document(@name)"/>
  </xsl:template>
</xsl:stylesheet>

이제 각 파일이 약 8MB이며 변환이 오랜 시간이 걸리기 때문에 성능을 향상 시키려고 노력하고 있지만 또 다른 질문입니다.

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