>

XSLT 1.0을 사용하여 XML 문서를 다른 XML 스키마로 변환하고 있습니다. 소스 문서는 소스 데이터베이스가 작성된 소스 데이터베이스에 따라 요소가 있거나 없을 수 있습니다.

EG

  <Patients>
        <Patient id="1019">
            <Surname>Acqua</Surname>
            <Forenames>Matthew James</Forenames>
            <VoicePhone>0111 222 33333</VoicePhone>
        </Patient>
        <Patient id="1020">
            <Surname>Red</Surname>
            <Forenames>James Alan</Forenames>
        </Patient>
    </Patients>

두 번째 환자의 VoicePhone이 존재하지 않고 비어 있기 때문에 XML을 통해 변환 한 후 결과 출력에 빈 요소가 있습니다.

XSLT는 다음 라인을 따릅니다 :

<xsl:template match="//Patients/Patient">
<PatientRxs>
  <PatientInfo>
    <FirstName>
      <xsl:value-of select="Forenames"/>
    </FirstName>
    <Telephone>
      <xsl:value-of select="VoicePhone"/>
    </Telephone>
  </PatientInfo>
</PatientRxs>
</xsl:template>

그리고 나는 끝납니다 :

<PatientRxs>
    <PatientInfo>
        <FirstName>Matthew James</FirstName>
        <Telephone>0111 222 33333</Telephone>
    </PatientInfo>
</PatientRxs>
<PatientRxs>
    <PatientInfo>
        <FirstName>James Alan</FirstName>
        <Telephone/>
    </PatientInfo>
</PatientRxs>

실제로 원하는 곳 :

<PatientRxs>
    <PatientInfo>
        <FirstName>Matthew James</FirstName>
        <Telephone>0111 222 33333</Telephone>
    </PatientInfo>
</PatientRxs>
<PatientRxs>
    <PatientInfo>
        <FirstName>James Alan</FirstName>
    </PatientInfo>
</PatientRxs>

값이 존재하는지 테스트 할 수 있지만 소스 문서에는 없을 수있는 수백 가지 요소 중 하나 일 뿐이며 XSLT 시트가 매번 테스트되는 것을 피하고 싶습니다

  • 답변 # 1

    모든 요소와 일치하는 일반 템플릿을 사용하지만 해당 요소의 이름을 바꿀 수 있도록 매개 변수를 사용합니다

    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
      <xsl:output method="xml" indent="yes" />
      <xsl:strip-space elements="*" />
      <xsl:template match="//Patients/Patient">
        <PatientRxs>
          <PatientInfo>
            <xsl:apply-templates select="Forenames" mode="field">
              <xsl:with-param name="newName" select="'FirstName'" />
            </xsl:apply-templates>
            <xsl:apply-templates select="VoicePhone" mode="field">
              <xsl:with-param name="newName" select="'Telephone'" />
            </xsl:apply-templates>
          </PatientInfo>
        </PatientRxs>
      </xsl:template>
      <xsl:template match="*" mode="field">
          <xsl:param name="newName" select="local-name()" />
          <xsl:element name="{$newName}">
              <xsl:value-of select="." />
          </xsl:element>
      </xsl:template>
    </xsl:stylesheet>
    
    

    따라서 일치하는 요소가 존재하지 않으면 해당 요소에 대한 출력이 전혀 없습니다.

  • 답변 # 2

    <xsl:template match="Patients">
            <xsl:element name="PatientRxs">
                <xsl:for-each select="Patient">
                    <xsl:element name="PatientInfo">
                        <xsl:element name="Forenames">
                            <xsl:value-of select="Forenames"/>
                        </xsl:element>
                        <xsl:if test="VoicePhone">
                            <xsl:element name="Telephone">
                                <xsl:value-of select="VoicePhone"/>
                            </xsl:element>
                        </xsl:if>
                    </xsl:element>
                </xsl:for-each>
            </xsl:element>
        </xsl:template>
    Test if Voicephone exist then insert element otherwise not.
    
    

  • 답변 # 3

    <xsl:template match="Patients">
            <xsl:element name="PatientRxs">
                <xsl:for-each select="Patient">
                    <xsl:element name="PatientInfo">
                        <xsl:element name="Forenames">
                            <xsl:value-of select="Forenames"/>
                        </xsl:element>
                        <xsl:apply-templates select="VoicePhone"/>
                            </xsl:element>
                </xsl:for-each>
            </xsl:element>
        </xsl:template>
        <xsl:template match="VoicePhone">
            <xsl:choose>
                <xsl:when test="text()">
                    <xsl:element name="Telephone">
                        <xsl:value-of select="."/>
                    </xsl:element>
                </xsl:when>
                <xsl:when test="empty(.)"/>
            </xsl:choose>
          </xsl:template>
    
    

    이거 시도 해봐

  • 이전 java에서 JSON으로부터 필요한 값을 얻을 수 없습니다 "String 유형에 대해 getString (String) 메소드가 정의되지 않았습니다" "
  • 다음 angular - Nativescript에서 AuthGuard를 사용할 때 구성 요소에서 라우팅하는 방법