2010-08-02 3 views
1

원자 포매터로 xml 형식을 지정했습니다. 원자 포매터는 여러 번 인라인으로 네임 스페이스를 지정하는 것처럼 보입니다.C#에서 네임 스페이스 참조를 통합했습니다.

쉽게 통합 할 수있는 방법이 있습니까? 아래 예제는 각 속성에 대해 세 번 지정된 네임 스페이스를 보여줍니다. 이것은 끔찍한 일입니다.

나는 문서 상단에 접두사를 사용하고 문서에는 네임 스페이스를 사용하지 않습니다 (접두어 만 사용). 이를 달성하기 위해 작가 또는 포맷터 옵션이 있습니까?

<property p3:name="firstname" xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/" xmlns="http://a9.com/-/opensearch/extensions/property/1.0/">Drikie</property> 

감사

크레이그.

+0

좋은 질문, +1. 하나의 쉬운 솔루션에 대한 내 대답을 참조하십시오. :) –

답변

1

원자 포맷터는 네임 스페이스 인라인을 여러 번 지정하는 것처럼 보입니다.

쉽게 이러한 방법으로 을 통합 할 수 있습니까? 아래 예제는 각 속성에 대해 세 번 지정된네임 스페이스를 보여줍니다. 이것은 끔찍한 일입니다.

이보다 컴팩트 한 형식을 생산하는 가장 쉬운 방법은 당신의 XML 문서에서 다음 XSLT 변환을 적용하는 것입니다 : 예를 들어

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

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

<xsl:template match="*"> 
    <xsl:element name="{name()}" namespace="{namespace-uri()}"> 
    <xsl:copy-of select="descendant::*/namespace::*"/> 
    <xsl:copy-of select="namespace::*"/> 

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

, 다음과 같은 XML 문서에 적용 (기반 귀하의 질문에) :

<t xmlns="http://a9.com/-/opensearch/extensions/property/1.0/"> 
<property p3:name="firstname" 
    xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/" 
    xmlns="http://a9.com/-/opensearch/extensions/property/1.0/" 
    >Drikie</property> 
</t> 

원하는 결과는 produc입니다. 에드 :

<t 
xmlns="http://a9.com/-/opensearch/extensions/property/1.0/" 
xmlns:p3="http://a9.com/-/opensearch/extensions/property/1.0/"> 
    <property p3:name="firstname">Drikie</property> 
</t> 

주의 마십시오

네임 스페이스 선언이 다른 네임 스페이스에 같은 접두사를 결합하는 선언이있는 요소 위에 더 승진 할 수없는
  1. . 모든 네임 스페이스 노드가 모든 네임 스페이스에 필요하지 않을 수도 있습니다 일부는 모든 하위 노드, 아래로 전파되기 때문에, 구문 분석 된 XML 문서의 크기를 증가시킬 수 상위 요소에 네임 스페이스 선언을 추진

  2. .