그래,이 질문에 대한 다양한 변형을 보아 왔지만, 내가 해결하려고하는 것에 정확히 답하지 않고, 나는 너무 빽빽 해져 내가하는 일에 다른 대답들 중 하나를 적용하는 법을 보았다. 하나의 XML 문서의 XSLT 변환에 의해 생성 된 항목을 다른 XML 문서로 변환하는 방법
<?xml version="1.0" encoding="utf-8"?>
<message>
<cmd id="api_info">
<api-version>1.0</api-version>
<api-build>1.0.0.0</api-build>
</cmd>
</message>
지금 내가 XSLT 내가이 XML에 적용하고있어 변환을 가지고
나는 다음과 같이 뭔가를 보이는 일부 XML이있다. XSLT는 다음과 유사합니다 내가 얻을 출력은 내가 원하는 기본적으로
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="http://www.w3.org/2005/xpath-functions"
version="2.0">
<xsl:output method="xml" version="1.0" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="message"/>
</xsl:template>
<xsl:template match="message">
<xsl:element name="message" xmlns="http://www.companyname.com/schemas/product/Version001">
<xsl:apply-templates select="/message/cmd/@id"/>
</xsl:element>
</xsl:template>
<xsl:template match="/message/cmd/@id">
<xsl:variable name="_commandType" select="/message/cmd/@id"/>
<xsl:element name="messageHeader">
<xsl:element name="cmdType">
<xsl:value-of select="$_commandType"/>
</xsl:element>
</xsl:element>
<xsl:element name="messageBody">
<xsl:choose>
<xsl:when test="$_commandType = 'api_info'">
<xsl:element name="apiInfoBody">
<xsl:element name="apiVersion">
<xsl:value-of select="/message/cmd/api-version"/>
</xsl:element>
<xsl:element name="apiBuild">
<xsl:value-of select="/message/cmd/api-build"/>
</xsl:element>
</xsl:element>
</xsl:when>
<xsl:when test="$_commandType = 'communicationError'">
<xsl:element name="communicationErrorBody">
<xsl:element name="errorCode">
<xsl:value-of select="error-code"/>
</xsl:element>
<xsl:element name="badCmd">
<xsl:value-of select="bad-cmd"/>
</xsl:element>
</xsl:element>
</xsl:when>
</xsl:choose>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
과 같다 다음
<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="http://www.companyname.com/schemas/product/Version001">
<messageHeader xmlns="">
<cmdType>api_info</cmdType>
</messageHeader>
<messageBody xmlns="">
<apiInfoBody>
<apiVersion>1.0</apiVersion>
<apiBuild>1.0.0.0</apiBuild>
</apiInfoBody>
</messageBody>
</message>
하지만 제가 원하지 않는 것은 의 xmlns 있습니다 = " "의 속성은 <입니다. 메시지 헤더 > 및 <messageBody> 요소가 있습니다.
이제 요소에 대해 XSLT에서 네임 스페이스를 명시 적으로 지정하면 원하지 않는 특성이 한 수준 아래로 해당 특성의 자식으로 푸시됩니다.
난 그냥 내 XSL 각 속성을 의 xmlns = ""http://www.companyname.com/schemas/product/Version001 "를 추가 명시 적으로 내 전체 XSLT를 통해 갈 수:. 요소 정의를,하지만 난 더 우아한 방법이있을 것을 알고 우리 프로그래머 이런 종류의 헛점에 대한 지름길을 갖기에는 너무 게으르다 .XSLT가 단축 된 예제처럼 단순하지 않은 경우, 나는 그렇게하는 것이 바람직하다. 그러나 나는 더 좋은 방법이 있어야한다는 것을 알고있다.
사람이 내가 여기에 누락 알고 있나요?
감사합니다,
AlarmTripper
출력 XML을 변경하지 않았습니다. – AlarmTripper
어떤 XSLT 프로세서를 사용하고 있습니까? –
그래, 나는 새 제안이 잘 작동한다는 것을 확인했고 아마도 xmlns 할당을 스타일 시트 요소에 유지하기 때문에 아마도 내 솔루션보다 나은 해결책 일 것입니다. #default 옵션을 사용하면 다른 네임 스페이스 접두사 각각을 제외하지 않아도됩니다. 고마워요. 이 XSLT에 대해 배워야 할 것이 많아서 네임 스페이스가 더 까다로운 측면 중 하나라고 생각합니다. – AlarmTripper