2012-09-05 2 views
2

아마도 이것은 Using XSLT as an XML pre-processor의 거의 카본 카피입니다.하지만이 질문의 OP가 전체 예제를 게시하지 않았으므로 응답은 XSLT에 익숙하지 않은 사용자에게는 아무런 소용이 없습니다 . 광범위한 웹 검색을해도 도움이되지 않습니다. XSLT는 문서화가 잘되어 있지 않으며 웹에서 거의 논의되지 않은 것 같습니다. (분명히 매우 간단) 다음과 같이 어쨌든XSLT를 사용하여 XML에서 #ifdefs 사전 처리

... 내가 XML 파일이

는 foo.xml 말 :

<?xml version="1.0" encoding="UTF-8"?> 

<main> 

    <fee>blah</fee> 

    <ifdef select="OLD_VERSION"> 
    <fi>blah blah</fi> 
    </ifdef> 

    </main> 

(C-스타일 #ifdef와는 "IFDEF"로 변경 다음과 같이 내가 리눅스에 xsltproc 명령을 실행하려는

이안 로버츠의 대답의 빛)의 블록 :

xsltproc --stringparam xmlver NEW_VERSION --nonet foo.xslt foo.xml 

이는 # ifdef'ed 부분을 제외하려면 다음 XSLT 파일, foo.xslt을 사용하게 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" /> 
<xsl:param name="xmlver" required="yes"/> 

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

<xsl:variable name="defines" select="document($xmlver)/defines"/> 

<xsl:template match="ifdef"> 

    <xsl:variable name="this" select="."/> 

    <xsl:for-each select="$defines[def = $this/@select]"> 
    <xsl:apply-templates select="$this/node()" /> 
    </xsl:for-each> 

</xsl:template> 

</xsl:stylesheet> 

(I이 XSLT를 구성하기 위해 위에서 언급 한 질문에 대한 응답을 사용했다; 누락 된 성분은 "xmlver"값을 통합하는 위치/방법입니다. 물론 위의 내용이 정확하다는 보장은 없습니다. 그러나 이것은 본질적으로 내가 묻고있는 것 -이 모든 것이 어떻게 작용 하는가?)

건설적인 응답은 앞으로도 비슷한 요구 사항을 가진 많은 사람들에게 큰 도움이 될 것이며 의심의 여지가 없습니다. 그러나 귀찮고 교묘 한 제발 "왜 그걸하고 싶니?" 답장!

답변

1

사용자가 참조하는 질문은 ifdef에 XML 요소를 사용하는 XML 구조를 기반으로 한 것 같습니다. 귀하의 경우 #ifdef 행은 XML 요소가 아니므로 XSLT 템플리트와 일치시킬 수 없습니다. ifdef를 처리하고 결과 XML을 다른 XML 인식 처리를해야하는 경우 XSLT로 공급하는 데 비 XML 도구 (일반 C 사전 프로세서 일 수도 있음)를 사용하는 것이 좋습니다.

이전 문제로, 당신의 ifdefs에 대한 실제 XML 요소를 사용하는 것이 행복 경우 :

<?xml version="1.0" encoding="UTF-8"?> 
<main> 
    <fee>blah</fee> 

    <ifdef select="OLD_VERSION"> 
    <fi>blah blah</fi> 
    </ifdef> 

</main> 

다음 질문은 당신이 원하는 하나의 ifdef로 xmlver 명령 줄 매개 변수를 처리하는 방법이된다 (이전 질문이 어떻게 작동했는지는) 전체 정의 집합을로드 할 파일의 위치가 아니라 포함하는 것이 좋습니다. 그게 훨씬 간단합니다 : 이것

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:output method="xml" /> 
<xsl:param name="xmlver" /> 

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

<xsl:template match="ifdef"> 
<!-- for the ifdef we want, include all its child elements, text nodes etc 
     but not its attributes, for other ifdefs do nothing -->  
    <xsl:if test="@select = $xmlver"> 
    <xsl:apply-templates select="node()" /> 
    </xsl:if> 
</xsl:template> 

</xsl:stylesheet> 

내 이전 시도는 일부 프로세서에서 작동하는 <xsl:template match="ifdef[@select=$xmlver]">을 사용하지만 xsltproc에 (그것은 technically not allowed by the XSLT spec이며, xsltproc은 평소 테스트 장치, Xalan에보다 엄격한입니다).

+0

신속한 회신에 많은 감사드립니다. Ian 나는 가장 쉬운 옵션이었을 cpp [http://gcc.gnu.org/onlinedocs/cpp/]를 시도했습니다. 불행하게도 여러 개의 공백을 압축하고 의도하지 않은 변경을 훨씬 더 악화 시키거나 C와 유사한 구문을 발견하면 완전히 실패 할 수 있습니다! 내가 제안한대로 ifdef를 XML 스타일 블록으로 변경하면 행복합니다. 그렇다면 XSLT 파일에서 "선택"및/또는 "OLD_VERSION"을 사용하여 블록을 필터링하는 방법에 대한 질문이 생깁니다. –

+0

XSLT 1.0에서 문법적으로 '' –

+0

'required = "yes"'가 작동하도록 내 대답을 업데이트했습니다. –

1

제안 : xsltproc 대신 m4을 사용할 수 있습니까?

<?xml version="1.0" encoding="UTF-8"?> 

<main> 

    <fee>blah</fee> 

ifdef(`X',` 
    <fi>blah blah</fi> 
') 

</main> 

.

$ m4 jeter.xml 
<?xml version="1.0" encoding="UTF-8"?> 

<main> 

    <fee>blah</fee> 



</main> 

.

$ m4 -DX jeter.xml 
<?xml version="1.0" encoding="UTF-8"?> 

<main> 

    <fee>blah</fee> 


    <fi>blah blah</fi> 


</main> 
+0

을 가지고있었습니다. 하지만 슬프게도 m4는 분명히 UTF-8을 지원하지 않습니다. 또한, 동봉 된 블록에서 발생하는 따옴표에 대한 까다로운 수정은 필요하지 않습니다. (실제로 XML에는 "blah blah"보다 훨씬 더 많은 내용이 포함되어 있습니다 ;-) 블록에 대한 "here document"구문은 매우 유용 할 것입니다. 그러나이 문서에서 그에 대한 참조를 보지 못했습니다. –

+0

나는 이것을 알고 싶었고, 간단한 예제를 제공 했으므로 이것을 선택했을 것이다. 그러나 나는 upvoting 특권의 짧은 rep 지점 적다! –

0
나는 당신의 일반적인 접근으로 시작하고 싶습니다

:

답장이 XSLT에 익숙하지 않은 사람에게 아무 소용이 없습니다. XSLT는 웹에 대한 광범위한 검색 결과가 도움이되지 않았 음을 알 수 있습니다. XSLT는 매우 불충분하게 문서화되어 있고 웹에서 거의 논의되지 않은 것으로 보입니다.

이것은 기본적으로 익숙하지 않은 언어로 프로그램을 작성하려고하며 검색을 통해 해당 언어에 대한 정보를 찾으려고한다는 것을 알려줍니다. 그게 좋은 학습 전략인가요?

나는 당신의 문제가 너무 적다는 것이 아니라, "XSLT tutorial"가 2,300,000 히트를 제공한다고 생각했다. 최고의 것들은 모두 읽기에 가치가 있습니다. "저조한 문서화와 논의 부족"이라고 묘사하는 것은 이상한 것처럼 보입니다.

개인적으로 새로운 언어로 프로그래밍을 시작하려면 항상 주제에 관한 책을 읽어야합니다. 온라인 자료는 거의 신중하게 설계, 작성 및 텍스트 북으로 검토됩니다. 물론 내가 가장 유명한 XSLT 참조 서의 저자이기 때문에 그렇다고 말할 수는 있겠지만 그럼에도 불구하고 사실이라고 생각한다.

이제 문제를 해결할 수 있습니까? 정말로, 나는 후회한다. 어떤 사람들은이 포럼의 질문에 대해 이해하지 않고 사용할 수있는 테스트 코드로 응답합니다. 나는 그렇지 않습니다. 나는 사람들을 올바른 방향으로 향하게합니다. 이해할 수없는 언어로 코드 조각을 제공하지 않을 것입니다. 이 경우 올바른 방향으로 가리키면 언어를 사용하기 전에 언어를 배우라는 의미입니다.

+0

물론 언어를 광범위하게 사용하기 전에 체계적인 학습이 필요하다는 것에 대해 당신이 옳습니다. 언어를 최대한 활용하고 끊임없이 뒤죽박죽이되어서는 안됩니다! 그러나 이것은 일회적 인 요구 사항이었습니다. 또한, Ian Roberts가 대부분의 작업을 했음에도 불구하고 특정 작업에 고생하고 어려움을 겪어 많은 것을 배웠습니다. 내 경험으로는 공부했지만 아무것도 사용하지 않고 곧 메모리에서 사라집니다. "사용하거나 속담처럼 "그것을 잃는다. –

관련 문제