2010-07-29 3 views
3

이미 존재하지 않는 경우에만 부모 노드 내에 XSLT 입력 XML을 넣을 수 있습니까?XSLT가없는 경우 머리말과 꼬리말 추가

예를 들어, 내 입력의 경우 :

<Project>...</Project> 

내가 접두사와 접미사로 포장 할 :

<?xml version "1.0" encoding="utf-8"> 
<Site> 
    <Project>...</Project> 
</Site> 

그러나 경우 < 프로젝트 >이의 루트 노드가 아닌 입력, 나는 수정되지 않은 채로 남아 있습니다.

미리 감사드립니다.

+0

좋은 질문 (+1). 완전하고 간단한 솔루션에 대한 내 대답을 참조하십시오. –

+0

XSLT가이 특정 문제에 대한 최상의 솔루션이 아닐 수도 있습니다. XSLT는 기본적으로 기존 XML 문서와 스타일 시트를 기반으로 완전히 새로운 XML 문서를 생성하지만,이 경우 단순히 기존 문서를 조작하는 것이 바람직 할 수 있습니다. C#에서는 현재 자식 노드를 제거하는 것이 쉽고, ''태그를 넣고 새 요소의 자식으로 다시 추가합니다. – Flynn1179

+0

나는 다른 방법을 통해 더 쉽게되는 것에 대한 의견을 이해합니다. 이 앱은 이미 여러 변형을 사용하여 기존 입력 또는 잘못된 입력을 업그레이드합니다. – Mykro

답변

4

이 스타일 :

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="/Project"> 
     <Site> 
      <xsl:call-template name="identity"/> 
     </Site> 
    </xsl:template> 
</xsl:stylesheet> 

입력 1 :

<Project>...</Project> 

출력 1 :

<Site> 
    <Project>...</Project> 
</Site> 

입력 2 :

<Root> 
    <Project>...</Project> 
</Root> 

출력 2 :

<Root> 
    <Project>...</Project> 
</Root> 

참고 : 항등 변환.

+0

내 특정 문제에 대한 솔루션의 완벽한 드롭, 감사합니다. – Mykro

+0

@DJC : 안녕하세요! 언제든지 물어보십시오. –

0

접두사와 접미사 만 추가하면 grep과 같은 다른 Unix 옵션을 찾아 볼 수 있습니다.이 옵션은 훨씬 간단하게 할 수 있습니다. 당신이 XSL에서이 작업을 수행하려면 는 당신은 XSL을 사용 shuld : 때

<xsl:template match="/"> 
     <xsl:choose>  <!-- If Node Period exists add the text -->   <xsl:when test="Period"> 
         <xsl:text><Site></xsl:text> 
         <xsl:text>&#xa;</xsl:text> 
         <xsl:text><Site></xsl:text> 
      </xsl:when>  </xsl:choose> <xsl:apply-templates select="Notification"/> </xsl:template> 
+0

답변 해 주셔서 감사합니다. 나는 일하기가 어려워서 미안해. – Mykro

1

이 변환 패턴 일치 : 그것은 이미 <site> 요소의 자식 아닌 경우에만

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

<xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[not(self::site)]/Project"> 
    <site> 
    <xsl:call-template name="identity"/> 
    </site> 
</xsl:template> 
</xsl:stylesheet> 

가 요소 <Project> 랩. 이 XML 문서에 적용

: 올바른 원한 결과가을 생산

<t> 
    <Project>x</Project> 
    <site> 
     <Project>y</Project> 
    </site> 
</t> 

:

<t> 
    <site> 
     <Project>x</Project> 
    </site> 
    <site> 
     <Project>y</Project> 
    </site> 
</t> 
+0

질문 : "은 입력의 루트 노드가 아닙니다. 입력을 수정하지 않고 그대로두고 싶습니다." –

+0

내 도구 상자에 대한 유용한 답변, 특히 불일치! 감사합니다! – Mykro

관련 문제