2011-05-06 6 views
22

XML에서 간단한 일반 텍스트 출력을 생성하려면 XSL을 사용해야했습니다. 온라인에서 우수하고 간결한 예제를 찾지 못했기 때문에 여기서 내 솔루션을 게시하기로 결정했습니다. 더 나은 예를 참조하여 모든 링크는 물론 평가 될 것입니다 : 여기에 나를 도와xsl을 사용하여 일반 텍스트 출력

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" > 
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="script/command" xml:space="preserve">at -f <xsl:value-of select="username"/> <xsl:value-of select="startTime/@hours"/>:<xsl:value-of select="startTime/@minutes"/> <xsl:value-of select="startDate"/><xsl:text> 
</xsl:text></xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

몇 가지 중요한 사항 :

  1. XSL의 사용 : 출력은 표준 선언을 생략를 시작 부분에 출력 문서
  2. xsl : for-each 태그 내에 쓴 공백을 보존하기 위해 xml : space = "preserve"속성을 사용합니다. 이것은 또한 한 줄에 (줄 바꿈 제외) 해당 태그를 포함한 for-each 태그 내의 모든 코드를 작성해야했습니다.
  3. 줄 바꿈을 삽입하는 데 사용 - 여기서 다시 들여 쓰기 표준 xml을 생략해야했습니다.

생성이 XSLT 요망 출력이었다

7시 58분 2010년 4월 28일
ggroup70 15 -f에서 -f ggroup67에서 -f alluser 23시 58분 2010년 4월 17일
에서 : -f alluser 3시 58분 22.9에서 -f ggroup60 23시 58분 2010년 9월 21일
에서 -f ggroup61 7시 58분 2010년 9월 22일
에서 -f alluser 23시 58분 2010년 4월 18일
58 2010년 4월 18일
.2010

내가 말했듯이, 이것을 더 우아하게하는 방법에 대한 제안은 인정 될 것이다.


FOLLOW-UP 2011-05-08 : 당신은 템플릿 script/command에 일치하고을 제거하기 위해 정의 할 수 있습니다

<script xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="script.xsd"> 
    <command> 
     <username>alluser</username> 
     <startTime minutes="58" hours="23"/> 
     <startDate>17.4.2010</startDate> 
    </command> 
</script> 
+1

'concat (at -f ', username,' ', startTime/@ hours,' ', ...)'를 사용하여' '요소의 수를 절약 할 수 있습니다. 게다가 소스 코드를 래핑 할 수 있습니다. 태그 내부에서 그렇게하면 출력에 영향을 미치지 않습니다. –

+0

좋은 질문입니다, +1. 완전하고 매우 짧고 정말로 일반적인 솔루션에 대한 내 대답을보십시오. –

+0

@Christopher Creutzig : concat()에 대한 훌륭한 제안에 감사드립니다. "소스 코드 랩"이란 무엇입니까? – Chris

답변

21
  • : 여기

    내가 치료하고 XML의 유형입니다 xsl:for-each

  • concat()은 표현을 줄이고 명시 적으로 많은 수의 삽입을 방지하기 위해 사용할 수 있습니다. <xsl:text><xsl:value-of> 요소.
  • <xsl:text> 요소 사이의 줄 바꿈을 유지하는 대신에 캐리지 리턴에 엔터티 참조 &#xA;을 사용하면 코드 서식이 줄 바꿈을 엉망으로 만들지 않으므로 조금 더 안전합니다. 또한, 나를 위해, 그것은 명확한 줄 바꿈으로 읽고 의도를 이해하기가 더 쉽습니다.그냥 재미를 위해

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

    <xsl:template match="script/command"> 
     <xsl:value-of select="concat('at -f ' 
        ,username 
        ,' ' 
        ,startTime/@hours 
        ,':' 
        ,startTime/@minutes 
        ,' ' 
        ,startDate 
        ,'&#xA;')"/> 
    </xsl:template> 

</xsl:stylesheet> 
+0

감사합니다 Mads, 훌륭한 제안. 이것은 내가 찾고 있었던 바로 그 것이다. XPath 2의 유용한 기능에 대해 잊어 버렸습니다. 어떻게하면 은 일반적으로 줄 바꿈뿐만 아니라 캐리지 리턴도 필요로 할 때 창에 새 줄을 제공합니까? – Chris

+1

@Chris Dickinson 참고 :이 XSLT/XPath 1.0 솔루션은 XPath 2.0 기능을 사용하지 않습니다. ' '(줄 바꿈)으로 충분합니다. CRLF가 필요한 경우 ' '(캐리지 리턴)을 추가 할 수 있습니다. –

7

: 이것은 매우 일반적인 컴팩트 방법으로 수행 할 수 있습니다

<script> 
<command> 
    <username>John</username> 
    <startTime hours="09:" minutes="33"/> 
    <startDate>05/05/2011</startDate> 

    <username>Kate</username> 
    <startTime hours="09:" minutes="33"/> 
    <startDate>05/05/2011</startDate> 

    <username>Peter</username> 
    <startTime hours="09:" minutes="33"/> 
    <startDate>05/05/2011</startDate> 
</command> 
</script> 
이 XML 문서에 적용

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 
    <xsl:output method="text"/> 
    <xsl:strip-space elements="*"/> 

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

    <xsl:template match="username"> 
     at -f <xsl:apply-templates select="*|@*"/> 
    </xsl:template> 
</xsl:stylesheet> 

이 원하는 정확한 결과가 생성됩니다

at -f 09:33 05/05/2011 
    at -f 09:33 05/05/2011 
    at -f 09:33 05/05/2011 

: 모든 데이터가 출력이 텍스트 노드에 포함 할 경우 genaral 방법은 가장 적용 -하지 속성입니다.

+0

@ * 값이 누락되었습니다 (':'로 구분되어야 함). 또한, 출력에서 ​​'at -f'앞에 선행 공백이 문제가 될지 확실하지 않습니다. –

+0

@Mads Hansen :이 점에 대해 감사드립니다. 이제 해결되었습니다. –

+0

거의,하지만 소스 XML에 '@ 시간'값에 ':'이 있다고 생각하지 않습니다. 게시 된 샘플 XSL은 속성 값에서 선택하지 않고 ':'을 명시 적으로 넣는 것입니다. –

관련 문제