programing

스타일시트와 xslt proc로 xslt를 사용하여 xml에서 요소를 제거하는 방법은 무엇입니까?

powerit 2023. 10. 30. 21:18
반응형

스타일시트와 xslt proc로 xslt를 사용하여 xml에서 요소를 제거하는 방법은 무엇입니까?

다음과 같은 형태의 XML 파일을 많이 가지고 있습니다.

<Element fruit="apple" animal="cat" />

파일에서 제거할 파일입니다.

XSLT 스타일시트와 Linux 명령줄 유틸리티 xsltproc를 사용하여 어떻게 해야 합니까?

이 시점까지 스크립트에서 제거하고자 하는 요소가 포함된 파일 목록을 이미 가지고 있으므로 단일 파일을 매개 변수로 사용할 수 있습니다.


편집: 그 질문은 원래 의도가 부족했습니다.

제가 이루고자 하는 것은 (fruit=="apple" & animal=="cat") 요소 전체를 제거하는 것입니다.같은 문서에 "Element"라는 이름의 요소들이 많이 있는데, 이것들이 남아있기를 바랍니다. 그래서

<Element fruit="orange" animal="dog" />
<Element fruit="apple"  animal="cat" />
<Element fruit="pear"   animal="wild three eyed mongoose of kentucky" />

다음이 됨:

<Element fruit="orange" animal="dog" />
<Element fruit="pear"   animal="wild three eyed mongoose of kentucky" />

가장 기본적인 XSLT 설계 패턴 중 하나인 "아이덴티티 변환(아이덴티티 변환)"을 사용하면 다음과 같이 쓸 수 있습니다.

<xsl:스타일시트 버전="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform ">
<xsl:outputomit-xml-declar화="yes"/>
<xsl:template match="노드 ()|@*"><xsl:copy><xsl:apply-templates 선택="노드 ()|@*"/></xsl:copy></xsl: template>
<xsl:template 일치="요소[@fruit='apple' and @animal='cat']"/></xsl:스타일시트>

두 번째 템플릿이 값이 "apple"인 속성 "fruit"과 값이 "cat"인 속성 "animal"인 "Element"라는 이름의 요소에 대해서만 ID(1번째) 템플릿을 재정의하는 방법에 유의하십시오.이 템플릿에는 빈 본문이 있으므로 일치하는 요소가 단순히 무시됩니다(일치할 때는 아무것도 생성되지 않음).

이 변환이 다음 소스 XML 문서에 적용될 경우:

<doc>... 
<요소명="동일">foo</요소>...
<요소 과일="사과" 동물="고양이" /><요소과일="pear" 동물="고양이" /><요소명="same">baz</요소>...
<요소명="동일">풋바</요소>...
</doc>

원하는 결과가 생성됩니다.

<doc>... 
<요소명="동일">foo</요소>...
<요소과일="pear" 동물="고양이"/><요소명="same">baz</요소>...
<요소명="동일">풋바</요소>...
</doc>

ID 템플릿 사용 및 재정의에 대한 더 많은 코드 조각은 여기에서 확인할 수 있습니다.

@Dimtre Novatchev의 대답은 분명 올바르고 우아하지만, 일반화(OP가 묻지 않은)가 있습니다. 필터링하고 싶은 요소에도 보관하고 싶은 하위 요소나 텍스트가 있다면 어떨까요?

저는 이 작은 변화가 이 경우를 포함한다고 생각합니다.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    version="2.0">

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

    <!-- drop DropMe elements, keeping child text and elements -->
    <xsl:template match="DropMe">
        <xsl:apply-templates/>
    </xsl:template>

</xsl:stylesheet>

일치 조건은 다른 속성 등을 지정하는 데 복잡할 수 있으며, 다른 항목을 삭제하는 경우 여러 개의 템플릿을 사용할 수 있습니다.

이 입력 내용:

<?xml version="1.0" encoding="UTF-8"?>
<mydocument>
    <p>Here's text to keep</p>
    <p><DropMe>Keep this text but not the element</DropMe>; and keep what follows.</p>
    <p><DropMe>Also keep this text and <b>this child element</b> too</DropMe>, along with what follows.</p>
</mydocument>

를 생성합니다.

<?xml version="1.0" encoding="UTF-8"?><mydocument>
    <p>Here's text to keep</p>
    <p>Keep this text but not the element; and keep what follows.</p>
    <p>Also keep this text and <b>this child element</b> too, along with what follows.</p>
</mydocument>

XSLT Cookbook의 크레딧입니다.

언급URL : https://stackoverflow.com/questions/321860/how-to-remove-elements-from-xml-using-xslt-with-stylesheet-and-xsltproc

반응형