2013-03-12 1 views
3

xslt를 사용하여 다음 형식의 XML 데이터를 csv 형식으로 변환하려고합니다. 현재 특정 사용자 정의 필드에 대해 다중 값을 출력하려고 시도하고 있습니다. 이것은 내 xml 데이터입니다.xslt-ouput 특정 형식의 다중 값을 사용하는 XML to csv 변환

<input-xml> 
<add add-value="First Name"> 
    <value type="string">Newbee</value> 
    </add> 
    <add add-value="Surname"> 
    <value type="string">user1</value> 
    </add> 
    <add add-value="Title"> 
    <value type="string">Software,engineer</value> 
</add> 
<add add-value="Title"> 
    <value type="string">Associate level</value> 
    </add> 
<add add-value="Description"> 
    <value type="string">This user is new to xslt.</value> 
    </add> 
</input-xml> 

다음은 데이터 변환에 사용하는 xslt 코드의 스 니펫입니다. 로 출력 데이터에 내가 수 있어요 위의 코드와

<xsl:template match="input-xml"> 
    <!-- output the fields in order --> 
    <xsl:call-template name="output-field"> 
     <xsl:with-param name="field-value" select="*[(@attr-name = 'First')]/value"/> 
    </xsl:call-template> 
    ............. 
    ............. 
    <xsl:call-template name="output-field"> 
     <xsl:with-param name="field-value" select="*[(@attr-name = 'Title')]/value"/> 
    </xsl:call-template> 
</xsl:template> 

<xsl:template name="output-field"> 
    <xsl:param name="field-value"/> 
    <xsl:choose> 
     <xsl:when test="contains($field-value,$delimiter)"> 
      <!-- if the field value contains a delimiter, then enclose in quotes --> 
          <!--delimiter here is comma (,)--> 
      <xsl:text>"</xsl:text> 
      <xsl:value-of select="$field-value"/> 
      <xsl:text>"</xsl:text> 
     </xsl:when> 
     <xsl:otherwise> 
      <!-- otherwise output it raw --> 
      <xsl:value-of select="$field-value"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template 

:

Newbee,User1,Software engineer,This user is new to xslt. 

이만큼 더 여러 값이없는 절대적으로 괜찮습니다. 문제는 '제목'필드에 두 개의 값이 있는데 아래에 따옴표 ("")로 묶어야합니다. 예상 출력 CSV 데이터 : 나는 위의 코드를 확인해야합니다 얼마나 더 진행 .. 이 사람이 나를 도울 수있는 어떤 변화 알아낼 수 아니에요

Newbee,User1,"|Software engineer|,|Associate level|",This user is new to xslt. 

.. ??

@LarsH 내가 게시 한 질문에 대한 귀하의 이전 답변은 훌륭합니다. 아래의 xml 형식에서 xslt가 원하는 방식으로 작동하지 않습니다.

내가지고있어 출력은
<input-xml> 
<add add-value="First Name"> 
    <value type="string">Newbee</value> 
    </add> 
    <add add-value="Surname"> 
    <value type="string">user1</value> 

<add add-value="Title"> 
    <value type="string">Associate level</value> 
    <value type="string">Software,engineer</value> 
</add> 

<add add-value="Description"> 
    <value type="string">This user is new to xslt.</value> 
    </add> 
</input-xml> 

Newbee,User1,Software engineerAssociate level,This user is new to xslt. 

내가 다른 XSLT이 XML을 처리 할 수 ​​있도록 작성해야합니까 ..? 두 xml 변형을 처리하기 위해 기존 xslt 자체를 수정할 수 있습니까?

+0

파란, 내 대답이 도움이 되었습니까? 그렇지 않다면, 필요한 것이 무엇인지 알려주십시오. 문제가 해결되면 "수락"녹색 체크 표시를 확인하는 것을 잊지 마십시오. – LarsH

답변

1

값을 출력하는 대신 필드 (특성)의 이름을 사용하도록 출력 필드 서식 파일을 변경했습니다. 예 : field-value 대신 field-name 매개 변수를 전달하십시오. 그런 다음 여러 값에 대한 논리를 해당 템플릿에 넣을 수 있습니다.

는 [두 번째 생각에, 당신은 필드 값 *을 전달하여 단지뿐만 아니라이 작업을 수행 할 수 * 당신이 이미 있었다 ... 단지 당신이 전달하는 것은, 반드시 단지를 노드 집합임을 인식 방법 . 당신이 그 세부 사항 중 일부에 대해 더 많은 도움을 필요로하는 경우

<xsl:template name="output-field"> 
<xsl:param name="field-name"/> 
<xsl:variable name="field-values" select="*[@attr-name = $field-name]" /> 
<xsl:choose> 
    <xsl:when test="count($field-values) > 1"> 
    <xsl:text>"</xsl:text> 
     <xsl:for-each select="$field-values"> 
     <xsl:value-of select="concat('|', ., '|')" /> 
     <xsl:if test="position() != last()">,</xsl:if> 
     </xsl:for-each> 
    <xsl:text>"</xsl:text> 
    </xsl:when> 
    <xsl:when test="contains($field-values[1], $delimiter)"> 
     ... the rest of your existing template 
</xsl:choose> 
</xsl:template> 

은, 우리가 어떤 사람을 알려 : 단일 값] 출력 필드 템플릿에서

, 당신은 뭔가처럼 말할 수있다.

+0

@ LarsH이므로 템플릿 출력 필드에 대한 호출은 다음과 같습니다. FarSh018

+0

네, 작은 따옴표 ('select' 속성의 큰 따옴표 안에)로 문자열 매개 변수 값을 전달해야한다는 점을 제외하면 다음과 같습니다 :'% ' – LarsH

+1

도움을 주셔서 감사합니다. – FarSh018