아마도 이것은 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"값을 통합하는 위치/방법입니다. 물론 위의 내용이 정확하다는 보장은 없습니다. 그러나 이것은 본질적으로 내가 묻고있는 것 -이 모든 것이 어떻게 작용 하는가?)
건설적인 응답은 앞으로도 비슷한 요구 사항을 가진 많은 사람들에게 큰 도움이 될 것이며 의심의 여지가 없습니다. 그러나 귀찮고 교묘 한 제발 "왜 그걸하고 싶니?" 답장!
신속한 회신에 많은 감사드립니다. Ian 나는 가장 쉬운 옵션이었을 cpp [http://gcc.gnu.org/onlinedocs/cpp/]를 시도했습니다. 불행하게도 여러 개의 공백을 압축하고 의도하지 않은 변경을 훨씬 더 악화 시키거나 C와 유사한 구문을 발견하면 완전히 실패 할 수 있습니다! 내가 제안한대로 ifdef를 XML 스타일 블록으로 변경하면 행복합니다. 그렇다면 XSLT 파일에서 "선택"및/또는 "OLD_VERSION"을 사용하여 블록을 필터링하는 방법에 대한 질문이 생깁니다. –
XSLT 1.0에서 문법적으로 '' –
'required = "yes"'가 작동하도록 내 대답을 업데이트했습니다. –