2012-04-08 3 views
1

당신은 속성 예를 들어, XML 형식으로XSL 파일

<Properties> 
    <Property value="abc">ABC1</Property> 
    <Property value="...">...</Property> 
</Properties> 

다음 파일을 저장하는 경우 우리는 xslt를 사용하여 (속성, 입력) XML 파일을 처리하고 abc 요소 (입력 XML 파일)를 ABC1 (사용자 정의 출력 XML 파일) 등으로 대체 할 수 있습니다.

예를 들어 어떤 속성은 다음 XML 태그가 변화하는 입력 XML 파일 태그에 정의하지 않는 경우 등록 정보 파일이 입력 XML 파일의 각 태그에 대해 정의 된 속성으로 구성된 내 아래에 입력 XML 파일

<?xml version="1.0" encoding="UTF-8"?> 
     <Content> 
      <abc>xxx 
       <def>zzz 
        <ghi>ccc</ghi>ttt 
        <dynamic val="hello" xmlns="http://abc.com" /> 
         world 
        <dynamic val="hi" xmlns="http://abc.com" /> 
         <dynAttr> 
         <dyn value=123 /> 
         <dyn value=222 /> 
         </dynAttr> 
         <lmn>data</lmn> 

        </def> 
       </abc> 
     </Content> 

고려 입력 XML 파일 태그와 동일한 태그 이름.

<?xml version="1.0" encoding="UTF-8"?> 
<Properties> 
      <Property value="Content">CONTENT12</Property> 
      <Property value="abc">ABC1</Property> 
      <Property value="def">www</Property> 
       <Property value="ghi">yyy</Property> 
      <Property value="dynamic">Dynamic1</Property> 
      <Property value="dynAttr">DynAttribute</Property> 
</Properties> 

XSLT를 사용하여 등록 정보의 XML 파일을 참조하고, 변환 된 XML 파일에서 주어진 입력 XML 파일 및 결과에 적용될 때, 도시 된 바와 같이, XSL 파일을 작성

<?xml version="1.0" encoding="UTF-8"?> 

       <www>zzz 
        <yyy>ccc</yyy>ttt 
        <Dynamic1 val="hello" xmlns="http://abc.com>hello</Dynamic1> 
         world 
        <Dynamic1 val="hi" xmlns="http://abc.com>hi</Dynamic1> 
         <DynAttribute> 
         <dyn>123</dyn> 
         <dyn>222</dyn> 
         </DynAttribute> 
         <lmn>data</lmn> 
        </www> 
if the above code is my requirement then what must be the relative xpath expression in your answer <xsl:template match=" "> 
+0

Maestro13 @ ​​: 안녕하세요 할 당신은 위의 질문에 위의 솔루션에 대한 답변을 가지고 있습니다 –

답변

2

내 예제 파일 아니다 잘 형성,하지만 당신은 것을 해결하고 등록 정보 파일이 prop.xml 경우,이 작업을해야합니다.

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


<xsl:template match="*"> 
<xsl:variable name="n" select="name()"/> 
<xsl:variable name="new"> 
    <xsl:for-each select="document('prop.xml')"> 
    <xsl:choose> 
    <xsl:when test="key('n',$n)"> 
    <xsl:value-of select="key('n',$n)"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="$n"/> 
    </xsl:otherwise> 
    </xsl:choose> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:element name="{$new}"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
</xsl:element> 
</xsl:template> 

<xsl:key name="n" match="Property" use="@value"/> 

</xsl:stylesheet> 

이름 요소에서해야 어떤 네임 스페이스 말을하지 않습니다 질문 ABO 식을 ve 코드는 항상 네임 스페이스에 넣지 않습니다. 당신이 그 (것)들을 원래의 변화와 같은 네임 스페이스 XSL에 있어야합니다 :

<xsl:element name="{$new}" namespace="{namespace-uri()}"> 

에 요소 행 가장 유연한 대안은 아마 특성 파일에 로컬 이름과 네임 스페이스 URI를 모두 지정하는 것입니다.

갱신

하면 코멘트에 주목하고 업데이트 된 대답은 당신이 다음과 같이 사소한 수정을 def 요소를 네임 스페이스를 보존 만 처리 할 같이

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


<xsl:template match="/"> 
<xsl:apply-templates select="//def"/> 
</xsl:template> 

<xsl:template match="*"> 
<xsl:variable name="n" select="name()"/> 
<xsl:variable name="new"> 
    <xsl:for-each select="document('prop.xml')"> 
    <xsl:choose> 
    <xsl:when test="key('n',$n)"> 
    <xsl:value-of select="key('n',$n)"/> 
    </xsl:when> 
    <xsl:otherwise> 
    <xsl:value-of select="$n"/> 
    </xsl:otherwise> 
    </xsl:choose> 
    </xsl:for-each> 
</xsl:variable> 
<xsl:element name="{$new}" namespace="{namespace-uri()}"> 
    <xsl:copy-of select="@*"/> 
    <xsl:apply-templates/> 
</xsl:element> 
</xsl:template> 

<xsl:key name="n" match="Property" use="@value"/> 

</xsl:stylesheet> 
+0

당신의 응답을 주셔서 감사합니다. 그러나 copy-of 또는 copy 태그를 사용할 때 필자는 네임 스페이스 대신 입력 XML 파일과 관련된 다른 네임 스페이스를 갖게됩니다. –

+0

위의 copy-of를 사용하는 유일한 장소는 속성을 복사하는 것입니다. 속성 이름을 바꾸거나 소스 파일에 네임 스페이스가있는 경우 요소 이름을 특성 파일과 일치시키는 방법 (네임 스페이스 URI를 사용하고 접두어를 무시하거나 위와 같이)를 변경하지 않아도됩니다. 네임 스페이스 URI를 무시하고 접두사를 포함한 이름 일치) 네임 스페이스 사용에 대한 표시를 제공하여 질문을 편집하는 경우 내 대답을 수정합니다. –

+0

@ David Carlisle : 감사합니다. 코드는 정상적으로 작동하지만 정확히 일치하는 것을 알고 있습니다. 이것은 입력 XML의 각 노드마다 일치한다는 것을 의미합니다. –