>

발송인이 임의로 사용할 네임 스페이스 접두사를 미리 모르고 XML 메시지의 하나 이상의 요소에 대한 네임 스페이스 URI를 바꾸려면 어떻게해야합니까?

이 질문의 형식은 여러 번 요청되었지만, 내가 찾은 모든 답변 (여기 및 다른 사이트에서)은 접두사에 대한 정확한 지식을 전제로합니다. 접두사는 정의에 따라 임의적이며 이에 대한 해결책은 사용 된 접두사에 대한 지식이 필요하지 않습니다.

해결책이 있지만 출력에 필요없는 정크가 생깁니다. 간단한 입력 :

<?xml version="1.0" encoding="UTF-8"?>
<myThing xmlns:s="http://tempuri3.org/">
    <s:thisThing>
        <thatThing xmlns="http://cheapCookies.org/"/>
        <anotherThing xmlns="http://kingkong.org">
            <thisThing/>
        </anotherThing>
    </s:thisThing>
</myThing>

이것은 XSLT입니다 :

<?xml version="1.0" ?> 
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:param name="sourceNamespace" select="'http://tempuri3.org/'" /> 
  <xsl:param name="targetNamespace" select="'http://tempuri.org'"/> 
  <xsl:output method="xml" encoding="utf-8" indent="yes"/> 
    <xsl:template match="node() | @*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node() | @*" />
        </xsl:copy>
    </xsl:template>
    <xsl:template match="*">
        <xsl:choose>
            <xsl:when test="namespace-uri() = $sourceNamespace">
                <xsl:element name="{name()}" namespace="{$targetNamespace}">
                    <xsl:apply-templates select="node() | @*"/>
                </xsl:element>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="identity"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

이것은 위 XSLT의 출력입니다 :

<?xml version="1.0" encoding="utf-8"?>
<myThing xmlns:s="http://tempuri3.org/">
    <s:thisThing xmlns:s="http://tempuri.org">
        <thatThing xmlns="http://cheapCookies.org/" xmlns:s="http://tempuri3.org/"/>
        <anotherThing xmlns="http://kingkong.org" xmlns:s="http://tempuri3.org/">
            <thisThing/>
        </anotherThing>
    </s:thisThing>
</myThing>

이것은 원하는 결과입니다 :

<?xml version="1.0" encoding="utf-8"?>
<myThing xmlns:s="http://tempuri.org/">
    <s:thisThing>
        <thatThing xmlns="http://cheapCookies.org/"/>
        <anotherThing xmlns="http://kingkong.org">
            <thisThing/>
        </anotherThing>
    </s:thisThing>
</myThing>


  • 답변 # 1

    와이즈 비즈

    그러면 아마해야 할 일 :

    I do know the source and target namespace uris,

    사용 된 정확한 프로세서에 따라 결과가 약간 다를 수 있습니다. 예를 들어 Saxon 6.5는 다음을 반환합니다.

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:old="http://tempuri3.org/"
    exclude-result-prefixes="old">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="old:*">
        <xsl:element name="{local-name()}" namespace="http://tempuri.org">
            <xsl:apply-templates select="@*|node()"/>
        </xsl:element>
    </xsl:template>
    </xsl:stylesheet>
    
    
    <?xml version="1.0" encoding="UTF-8"?> <myThing xmlns:s="http://tempuri3.org/"> <thisThing xmlns="http://tempuri.org"> <thatThing xmlns="http://cheapCookies.org/"/> <anotherThing xmlns="http://kingkong.org"> <thisThing/> </anotherThing> </thisThing> </myThing>

  • 이전 java - 생성자에서 applicationproperties 값에 액세스하는 방법
  • 다음 apache - uima ruta의 출력을 얻지 못함