루트 요소에 네임 스페이스 추가

JohnLBevan

루트 요소에 모든 네임 스페이스 접두사를 정의하려는 XSLT 변환을 작성하고 있습니다. 기본적으로 MS는 해당 스키마를 사용하기 위해 XML 계층 구조의 첫 번째 요소에 새 접두사 정의를 만드는 것처럼 보입니다. 즉, 동일한 스키마의 공유 조상과 관련되지 않은 요소가 여러 요소에서 참조 될 수 있습니다.

루트 요소를 이와 같이 코딩하면 모두 원하는대로 작동합니다.

<!-- ... -->

<ns0:root xmlns:ns0="http://some/schema" xmlns:ns1 = "http://another/schema">
    <!-- rest of XSLT; including calls to other templates -->
</ns0:root>

<!-- ... -->

그러나 나는 이것을 사용하여 코딩하는 방법을 찾을 수 없습니다 xsl:element. 예 :

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://some/schema" 
    xmlns:ns1 = "http://another/schema"
>
    <!-- ... -->

    <xsl:element name="ns0:root">
        <xsl:attribute name="ns1" namespace="http://www.w3.org/2000/xslns/">http://another/schema</xsl:attribute>
        <!-- rest of XSLT; including calls to other templates -->
    </xsl:element> 

    <!-- ... -->

xls:element해당 요소 자체가 아닌 for 스키마 에 대해 네임 스페이스 접두사를 선언 할 수 있습니까?


전체 예

XML

<Demo xmlns="http://some/schema">
    <a>Hello</a>
    <b>World</b>
</Demo>

XSLT

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://some/schema" 
    xmlns:ns1 = "http://another/schema"
    exclude-result-prefixes="xsl"
>

    <xsl:output method="xml" indent="yes" version="1.0"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*"> 
        <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template> 

    <xsl:template match="/ns0:Demo/ns0:a">
        <xsl:element name="ns1:z">
            <xsl:value-of select="./text()" />
        </xsl:element>
    </xsl:template> 

    <xsl:template match="/ns0:Demo/ns0:b">
        <xsl:element name="ns1:y">
            <xsl:value-of select="./text()" />
        </xsl:element>
    </xsl:template> 

</xsl:stylesheet>

결과

<Demo xmlns="http://some/schema">
    <ns1:z xmlns:ns1="http://another/schema">Hello</ns1:z>
    <ns1:y xmlns:ns1="http://another/schema">World</ns1:y>
</Demo>

원하는 결과

<Demo xmlns="http://some/schema" xmlns:ns1="http://another/schema">
    <ns1:z>Hello</ns1:z>
    <ns1:y>World</ns1:y>
</Demo>

또는

<ns0:Demo xmlns:ns0="http://some/schema" xmlns:ns1="http://another/schema">
    <ns1:z>Hello</ns1:z>
    <ns1:y>World</ns1:y>
</ns0:Demo>
Martin Honnen

최소한의 예는 및 / 또는 리터럴 결과 요소 xsl:element대신 사용해야하는 이유를 설명하지 않지만 xsl:copyXSLT 1.0에는 xsl:namespace지침 이 없으므로 ( https://www.w3.org/TR/xslt20/#creating-namespace-nodes ) 유일한 방법은 스타일 시트 루트에서 네임 스페이스 노드를 복사하는 것입니다.

<xsl:stylesheet 
    version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns0="http://some/schema" 
    xmlns:ns1 = "http://another/schema"
    exclude-result-prefixes="xsl"
    >

    <xsl:output method="xml" indent="yes" version="1.0"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*"> 
        <xsl:element name="{name(.)}" namespace="{namespace-uri(.)}">
            <xsl:copy-of select="document('')/*/namespace::*[. = 'http://another/schema']"/>
            <xsl:apply-templates select="@* | node()" />
        </xsl:element>
    </xsl:template> 

    <xsl:template match="/ns0:Demo/ns0:a">
        <xsl:element name="ns1:z">
            <xsl:value-of select="./text()" />
        </xsl:element>
    </xsl:template> 

    <xsl:template match="/ns0:Demo/ns0:b">
        <xsl:element name="ns1:y">
            <xsl:value-of select="./text()" />
        </xsl:element>
    </xsl:template> 

</xsl:stylesheet>

(또는를 갖는 다른 노드와 같은 매개 변수 또는 변수가 있지만 먼저 설정 노드에 결과 트리 조각을 변환하는 당신이 추가로 수도 그런 식으로 exsl:node-setms:node-set).

리터럴 결과 요소와 xsl:element다른 결과를 제공 하는 이유에 대해서는 https://www.w3.org/TR/xslt#literal-result-element에서 다음과 같이 말합니다.

생성 된 요소 노드에는 스타일 시트 트리의 요소 노드에 있던 네임 스페이스 노드의 복사본도 있습니다.

반면 https://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element 그런 말을하지 않습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

XML-루트에없는 네임 스페이스 추가

분류에서Dev

네임 스페이스가있는 xpath 쿼리 루트 요소

분류에서Dev

JAXB 루트가 아닌 요소에서 네임 스페이스 가져 오기?

분류에서Dev

XSLT는 루트 네임 스페이스를 제거하고 다른 요소에 네임 스페이스를 추가합니다.

분류에서Dev

네임 스페이스 요소가 다른 단일 루트 요소에 대한 Xpath 유효성 검사

분류에서Dev

루트 요소의 dataweave xml 네임 스페이스 선언

분류에서Dev

xsl 네임 스페이스가있는 새 요소 추가

분류에서Dev

네임 스페이스없이 SOAP 헤더 요소 추가

분류에서Dev

WiX는 루트 요소에서 네임 스페이스를 제거합니다.

분류에서Dev

문서에 Xml 요소를 추가 할 때 네임 스페이스 문제

분류에서Dev

XML에서 네임 스페이스가없는 요소

분류에서Dev

루트 노드에 여러 유형이있을 수있는 경우 루트 노드에 네임 스페이스 추가

분류에서Dev

XmlTypeAttribute.Namespace가 루트 요소에 대한 네임 스페이스를 설정하지 않는 이유는 무엇입니까?

분류에서Dev

BizTalk에서 XSD 루트 네임 스페이스 변경

분류에서Dev

루트 태그에있는 xslt의 네임 스페이스

분류에서Dev

XMLSerializer-네임 스페이스에 추가 된 클래스?

분류에서Dev

xml에 루트 노드에 대한 네임 스페이스가있을 때 XElement 및 XName이 충돌 함

분류에서Dev

XML 네임 스페이스를 루트 요소로 끌어 올리는 방법

분류에서Dev

Visual Studio 2015에서 프로젝트의 모든 클래스에 하위 네임 스페이스 추가

분류에서Dev

IronPython이 C #의 범위에 네임 스페이스를 추가

분류에서Dev

루트 태그에 여러 네임 스페이스가있는 XML 역 직렬화

분류에서Dev

javascript 네임 스페이스가있는 스크립트를 사용하여 div 요소에서 hover 요소를 어떻게 사용합니까?

분류에서Dev

soapEnvolpe 및 네임 스페이스없이 xml을 하나로 변환하고 xslt를 사용하여 내부 요소에 네임 스페이스 추가

분류에서Dev

PHP의 xml 노드에 네임 스페이스 속성 추가

분류에서Dev

Web.Config에 명명 된 네임 스페이스 추가

분류에서Dev

XML에서 XSD 생성 및 네임 스페이스 XSLT 추가

분류에서Dev

XSLT-노드 XML에 네임 스페이스 추가

분류에서Dev

기존 xml에 네임 스페이스 및 별칭 추가

분류에서Dev

Visual Studio 계층화 다이어그램에 네임 스페이스 아티팩트 추가

Related 관련 기사

  1. 1

    XML-루트에없는 네임 스페이스 추가

  2. 2

    네임 스페이스가있는 xpath 쿼리 루트 요소

  3. 3

    JAXB 루트가 아닌 요소에서 네임 스페이스 가져 오기?

  4. 4

    XSLT는 루트 네임 스페이스를 제거하고 다른 요소에 네임 스페이스를 추가합니다.

  5. 5

    네임 스페이스 요소가 다른 단일 루트 요소에 대한 Xpath 유효성 검사

  6. 6

    루트 요소의 dataweave xml 네임 스페이스 선언

  7. 7

    xsl 네임 스페이스가있는 새 요소 추가

  8. 8

    네임 스페이스없이 SOAP 헤더 요소 추가

  9. 9

    WiX는 루트 요소에서 네임 스페이스를 제거합니다.

  10. 10

    문서에 Xml 요소를 추가 할 때 네임 스페이스 문제

  11. 11

    XML에서 네임 스페이스가없는 요소

  12. 12

    루트 노드에 여러 유형이있을 수있는 경우 루트 노드에 네임 스페이스 추가

  13. 13

    XmlTypeAttribute.Namespace가 루트 요소에 대한 네임 스페이스를 설정하지 않는 이유는 무엇입니까?

  14. 14

    BizTalk에서 XSD 루트 네임 스페이스 변경

  15. 15

    루트 태그에있는 xslt의 네임 스페이스

  16. 16

    XMLSerializer-네임 스페이스에 추가 된 클래스?

  17. 17

    xml에 루트 노드에 대한 네임 스페이스가있을 때 XElement 및 XName이 충돌 함

  18. 18

    XML 네임 스페이스를 루트 요소로 끌어 올리는 방법

  19. 19

    Visual Studio 2015에서 프로젝트의 모든 클래스에 하위 네임 스페이스 추가

  20. 20

    IronPython이 C #의 범위에 네임 스페이스를 추가

  21. 21

    루트 태그에 여러 네임 스페이스가있는 XML 역 직렬화

  22. 22

    javascript 네임 스페이스가있는 스크립트를 사용하여 div 요소에서 hover 요소를 어떻게 사용합니까?

  23. 23

    soapEnvolpe 및 네임 스페이스없이 xml을 하나로 변환하고 xslt를 사용하여 내부 요소에 네임 스페이스 추가

  24. 24

    PHP의 xml 노드에 네임 스페이스 속성 추가

  25. 25

    Web.Config에 명명 된 네임 스페이스 추가

  26. 26

    XML에서 XSD 생성 및 네임 스페이스 XSLT 추가

  27. 27

    XSLT-노드 XML에 네임 스페이스 추가

  28. 28

    기존 xml에 네임 스페이스 및 별칭 추가

  29. 29

    Visual Studio 계층화 다이어그램에 네임 스페이스 아티팩트 추가

뜨겁다태그

보관