문제

XSLT 문서 내에서 현재 디렉터리에 있는 파일 집합을 반복할 수 있습니까?

보고서를 생성하기 위해 일부 분석이 필요한 xml 파일로 가득 찬 디렉토리가 있는 상황이 있습니다.단일 문서에서 작동하는 스타일시트가 있지만 XML 문서를 병합하기 위해 다른 도구를 사용하지 않고 이를 확장하고 싶습니다.

나는 다음과 같이 생각했습니다.

<xsl:for-each select="{IO Selector Here}">
    <xsl:variable select="document(@url)" name="contents" />
    <!--More stuff here-->
</xsl:for-each>
도움이 되었습니까?

해결책

XSLT 2.0과 Saxon에서는 다음을 사용하여 이 작업을 수행할 수 있습니다. collection() 기능:

<xsl:for-each select="file:///path/to/directory">
  <!-- process the documents -->
</xsl:for-each>

보다 http://www.saxonica.com/documentation/sourcedocs/collections.html 상세 사항은.

XSLT 1.0에서는 별도의 도구로 처리하려는 문서를 나열하는 색인을 만들어야 합니다.귀하의 환경은 그러한 도구를 제공할 수 있습니다.예를 들어 Cocoon에는 디렉토리 생성기 그러한 인덱스를 생성합니다.하지만 귀하의 환경이 어떤지 모르면 무엇을 추천해야 할지 알기가 어렵습니다.

다른 팁

다른 사람들이 말했듯이 플랫폼 독립적인 방식으로는 이를 수행할 수 없습니다..NET 세계에서는 document('dir://c:/foo/')가 'c:\foo' 디렉터리에 있는 파일 목록을 원하는 임의 형식으로 반환하도록 사용자 정의 XmlResolver를 만들 수 있습니다.사용자 정의 XmlResolver에 대한 자세한 내용은 다음 링크를 참조하세요.

XmlUrlResolver 클래스 사용자 정의
XmlResolver의 강력한 기능

또한 스크립트를 사용할 수도 있습니다(예: msxsl:스크립트 요소) 또는 XSLT 스타일시트의 확장명입니다.

이러한 모든 접근 방식은 XSLT 코드를 다른 플랫폼으로 이식할 수 없게 만듭니다.

나는 XSL이 그런 식으로 작동하도록 설정되어 있지 않다고 생각합니다.이는 하나 이상의 문서에서 다른 항목에 의해 사용되도록 설계되었으며 다른 항목은 XSLT를 적용해야 하는 파일을 찾는 역할을 합니다.

하나의 기본 문서와 고정된 지원 문서 세트가 있는 경우 다음을 사용할 수 있습니다. document() 기능 특정 노드 및/또는 값을 반환하지만 귀하의 경우는 다른 것 같습니다.

XSLT 내에서는 이것이 불가능할 것이라고 생각합니다.

모든 XML 파일 이름을 <xsl:param name="files" />에 쉼표로 구분된 목록으로 전달하고 재귀와 substring-before() 및 substring-after()를 사용하여 반복할 수 있습니다.

여기에 사용할 수 있는 명령줄 도구가 있습니다. 이 도구는 입력을 처리하고 출력으로 변환하기 위해 Ant(Java 빌드 도구)에 내장된 XSLT 프로세서를 사용합니다.루프용 배치 파일로 쉽게 래핑할 수 있습니다.

svn://donie.homeip.net/public/tools

.Net을 사용하는 경우 XsltExtension을 사용하여 XSLT 문서에서 .net 클래스의 메서드를 호출할 수 있습니다.그런 다음 메서드는 nodeset를 XSLT로 다시 반환할 수 있습니다.따라서 귀하의 방법은 파일 IO 부분을 처리할 수 있습니다.

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