2009-03-10 4 views
7

XSL 변환을 처리하는 서버에서 네임 스페이스 검사가 비활성화되어 있습니다 (XSL을 작성한 사람이 네임 스페이스를 이해하지 못했기 때문). 나는 XSL을 변경해야하지만 ie 정의 된 네임 스페이스가 없기 때문에이를 테스트 할 수 없다. 그들은 모두 네임 스페이스의 모든 자격을 갖춘이기 때문에XSL 변환 중에 네임 스페이스를 무시할 수 있습니까?

<xsl:template match="element[position()=1]">... 

을 가지고 대신

<xsl:template match="ns:element[position()=1]">... 

의 그래서 그것은 XML의 요소와 일치하지 않습니다.

액세스 권한이 없기 때문에 서버에서 테스트 할 수 없습니다. 네임 스페이스 검사가 가능해야하고 다른 모든 변환을 깨뜨릴 것이므로 XSL을 수정하는 것은 쓸모가 없습니다.

그래서 내가해야 할 일은 XSL 변환 중에 네임 스페이스를 무시하는 방법을 찾는 것입니다. MSXML, XMLSpy (여기서 옵션을 찾을 수 없음)에 액세스 할 수 있으며, 정말로 필요한 경우 C#이나 비슷한 언어로 코드를 작성할 수 있습니다. 자세한 내용에 대한 덧글에 대한 응답으로 내가 몇 정규 표현식에를 코딩 할 수 있지만 난 정말, 특히 XML을 처리 할 때, 그 길을 가고 싶지 않아 최후의 수단으로

...

:

이것은 Methode Servlet (www.eidosmedia.com) 인스턴스를 실행하는 Windows 2003 가상 서버입니다. 이 서블릿이 XSL 변환을 수행하기 위해 어떤 기술을 사용하는지 모르겠습니다. 그들은 원래 XSL을 작성한 사람이 XSL을 이해하지 못하고 XSL에 포함시키지 않았기 때문에 네임 스페이스를 무시합니다. 이제 모든 XSL 파일 (수백)은 네임 스페이스가 없습니다.

이러한 모든 파일을 한 번에 해결하는 것은 흥미로운 과제 일 수 있지만, 지금 당장 필요한 것은 아닙니다. (그리고 부서별 관리자는 관련된 테스트의 양 때문에 어쨌든 동의하지 않습니다.) 내가 알고 싶은 것은 내가이 XSL 파일을 그대로 사용하고 네임 스페이스를 고려하지 않고 해당 XML 문서를 변형 할 수있는 도구 (또는 기술)가 있는지 여부입니다. 원래 XSL을 작성한 사람이 변형을 테스트하기 위해 비슷한 것을 사용해야했기 때문에 도구가 있어야한다고 생각합니다.

+0

서버에서 네임 스페이스 검사를 어떻게 비활성화합니까? 나는 그런 것을 들어 본 적이 없다. –

+0

변환을 처리하는 타사 제품 (Microsoft 또는 Sun 제품 아님)입니다. 개발자는 개발자에게 사용 중지 옵션을 제공하도록 요청했습니다. – ilitirit

+0

더 자세한 정보를 얻을 수 있습니까? 어떤 유형의 서버인지 등. 또한 네임 스페이스를 무시함으로써 해결해야 할 문제는 무엇입니까? 이름 공간을 무시하는 것은 매우 어렵 기 때문에 문제의 근본적인 문제를 안다면 대신 해결할 수 있습니다. –

답변

5

변환을 수행하여 "실제"변환을하기 전에 입력에서 모든 네임 스페이스를 제거하십시오. 하지만 ... 당신이 일 경우해야 할 지 모르겠습니다. 추악한 느낌.

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="@*"> 
    <xsl:attribute name="{local-name()}"> 
     <xsl:value-of select="." /> 
    </xsl:attribute> 
    </xsl:template> 

</xsl:stylesheet> 

원래 답 :

는 그 옵션이 될 것인가?

<xsl:template match="*[local-name()='element' and position()=1]">... 

(의견을 가리 켰을 때, - 그렇지 않은 것)

+0

불행히도. 내가 다른 코멘트에 올렸던 것에 따라 성냥은 단지보기이었다. "선택"기능도 있습니다. – ilitirit

+0

몇 가지 작업이 필요하다는 것 외에도 ... 왜이 기능이 작동하지 않아야합니까? – Tomalak

+0

작동하지 않아야하는 이유를 생각할 수 없습니다. (적용 할 템플릿 선택 = "/ * [local-name() = 'foo']/* [local-name() = 'bar'] /"> , 그러나 필요한 작업량으로 인해 네임 스페이스를 제거/삽입하는 정규식을 작성할 수 있습니다. 네임 스페이스가없는 변형을 허용하는 툴이 있다면 알고 싶습니다. 나는 이미 작업이 필요한 다른 솔루션을 알고 있습니다. – ilitirit

0

XML에서 얼마나 많은 네임 스페이스가이 변화되고?

1을 사용하면 일시적으로 해당 네임 스페이스를 XSL의 기본 네임 스페이스로 추가 할 수 있습니까? Ok는 출력 네임 스페이스 등을 변경해야 할 수도 있음을 의미하지만 테스트를 거친 후에는 이러한 비틀기를 제거 할 수 있습니다.

두 개 이상인 경우 네임 스페이스 전체에 로컬 이름 충돌이 없음을 나타냅니다. 테스트 입력 XML을 조정하여 모든 별칭이 동일한 네임 스페이스를 가리킨 다음 위의 비틀기를 수행 할 수 있습니까?

+0

10 개 이상의 네임 스페이스를 계산했습니다 (SpreadsheetML 파일). 이미 하나의 입력 파일에서 네임 스페이스를 제거했지만 새로운 파일을 테스트 할 때마다해야하기 때문에 좋은 해결책은 아닙니다. – ilitirit

+0

아참. 나는 당신이 필요로하는 것을 허용 할 XSL 프로세서를 존중하는 현대의 자아를 발견 할 수 있을지 의심 스럽다. 슬프게도 RegEx 스크립트는 당신 자신의 의지에 따른 것 같다. – AnthonyWJones

1

의견으로는 너무 길기 때문에 답변으로 게시하고 있습니다.

들어 본 적이없는 XSLT 프로세서는 입력 XML에서 네임 스페이스를 전역 적으로 무시할 수 없습니다. 네임 스페이스 및이를 사용하는 XML 문서를 모르는 경우 작성된 ​​XSL 변환이있는 경우 변환을 수행하기 위해 손상된 서블릿을 사용하거나 네임 스페이스를 제거하기 위해 XML 문서를 사전 처리해야합니다.

Tomalak이 게시 한 변환을 사용하면 정규 표현식을 사용하는 것과 달리 XML의 다른 모든 것을 엉망으로 만들지 않고이를 수행 할 수 있습니다. 그리고 그 일을 그렇게 많이하는 것은 아닙니다. 연결 변환은 매우 쉽습니다.

관련 문제