2012-06-05 4 views
4

매우 간단한 XML이 있습니다. 필자는 일부 XML을 재 작성하고 완성 된 텍스트를 최종 XML 파일에 추가하여 InDesign으로 가져올 때 사용합니다.XSLT를 사용하여 XML 빈 노드 제외

모든 레코드에서 모든 XML 필드가 사용되는 것은 아닙니다. 따라서 XSLT가 상용구 텍스트를 추가하면 XML 요소가 포함되지 않은 레코드에도 나타납니다.

">>"를 선택하여 요소를 찾은 다음 요소가 있으면 그 요소를 사용하거나 상용구를 무시하고 요소가 레코드에 없으면 NOTHING을 삽입하려고했습니다. 여기

은 몇 가지 예제 XML 데이터입니다 : 여기
<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <story> 
     <CL> 
      <CityDescription>City One</CityDescription> 
      <BK> 
       <CompanyName>Corporate Name</CompanyName> 
       <address>123 Main St</address> 
       <HoldingCo>Company Name</HoldingCo> 
       <TotalAssets>128,319,000</TotalAssets> 
       <TotalLiabilities>117,059,000</TotalLiabilities> 
       <TotalDeposits>89,847,000</TotalDeposits> 
       <EquityCapital>11,260,000</EquityCapital> 
      </BK> 
      <BK> 
       <CompanyName>Smaller Company</CompanyName> 
       <address>123 Central St</address> 
      </BK> 
     </CL> 
     <CL> 
      <CityDescription>City Two</CityDescription> 
      <BK> 
       <CompanyName>Corporate Name Three</CompanyName> 
       <address>123 High St</address> 
       <HoldingCo>Company Name</HoldingCo> 
       <TotalAssets>128,319,000</TotalAssets> 
       <TotalLiabilities>117,059,000</TotalLiabilities> 
       <TotalDeposits>89,847,000</TotalDeposits> 
       <EquityCapital>11,260,000</EquityCapital> 
      </BK> 
      <BK> 
       <CompanyName>Smaller Company Four</CompanyName> 
       <address>123 Jones St</address> 
      </BK> 
     </CL> 
    </story> 
</root> 

내가 사용하려고 한 XSLT이지만, 추가 "지주 공동 :" "총 자산 :"심지어하지 않았다 기록에 요소를 포함 :

<?xml version="1.0" encoding="UTF-8"?><!-- DWXMLSource="Testing.xml" --> 
<!DOCTYPE xsl:stylesheet [ 
]> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="XML" /> 
<xsl:template match="/"> 

<root> 
    <story> 
     <xsl:for-each select="root/story/CL"> 
      <CityDescription><xsl:value-of select="CityDescription"/></CityDescription><xsl:text> 
      </xsl:text> 
      <xsl:for-each select="BK"> 
       <CompanyName><xsl:value-of select="CompanyName"/></CompanyName><xsl:text> 
       </xsl:text> 
       <address><xsl:value-of select="address"/></address><xsl:text> 
       </xsl:text> 
       <HoldingCo><xsl:text>Holding Co: </xsl:text><xsl:value-of select="HoldingCo"/></HoldingCo><xsl:text> 
       </xsl:text> 
       <TotalAssets><xsl:text>Total Assets: </xsl:text><xsl:value-of select="TotalAssets"/></TotalAssets><xsl:text> 
       </xsl:text> 
       <TotalLiabilities><xsl:text>Total Liabilities: </xsl:text><xsl:value-of select="TotalLiabilities"/></TotalLiabilities><xsl:text> 
       </xsl:text> 
       <TotalDeposits><xsl:text>Total Deposits: </xsl:text><xsl:value-of select="TotalDeposits"/></TotalDeposits><xsl:text> 
       </xsl:text> 
       <EquityCapital><xsl:text>Total Assets: </xsl:text><xsl:value-of select="EquityCapital"/></EquityCapital><xsl:text> 
       </xsl:text> 
      </xsl:for-each> 
     </xsl:for-each> 
    </story> 
</root> 
</xsl:template> 
</xsl:stylesheet> 

나는 그들이 데이터에 나타나지 않는 경우 >> 그렇지 않으면 기본적으로 외 요소를 무시하면 >> 선택 사용하려고했으나 "그렇지 않으면"콘텐츠하지만 내 출력 쇼 아무것도.

제안 사항?

+3

모 놀리 식 for-each가 아닌 스타일 시트에서 템플릿 규칙을 사용하는 방법을 배웁니다. 그런 다음 요소가 비어있는 것과 같은 특별한 경우를 다루기 위해 규칙을 수정하는 것이 매우 쉽습니다. –

답변

4
Here's the problem: not all XML fields are being used in every record. So, when the XSLT adds the boilerplate text it appears even in the records that don't include the XML elements. 

이 템플릿을위한 것입니다 - XSLT에서 템플릿을 사용하지 않고는 객체 지향 프로그래밍 언어의 클래스를 사용하지 않는 것과 같다.

이 간단한 변환 (하나도 조건부 명령이 사용되었음을 통지)는 : 제공된 XML 문서에 적용

<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:variable name="vNL" select="'&#xA;'"/> 
    <xsl:template match="/"> 
     <root> 
      <story> 
       <xsl:apply-templates select="root/story/CL"/> 
      </story> 
     </root> 
    </xsl:template> 

    <xsl:template match="CL"> 
     <xsl:apply-templates select="CityDescription"/> 
     <xsl:apply-templates select="BK"/> 
    </xsl:template> 

    <xsl:template match="CityDescription | CompanyName | address"> 
     <xsl:element name="{name()}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="BK"> 
     <xsl:value-of select="$vNL"/> 
     <xsl:apply-templates select="CompanyName"/> 
     <xsl:apply-templates select="address"/> 
     <xsl:apply-templates select="HoldingCo"/> 
     <xsl:apply-templates select="TotalAssets"/> 
     <xsl:apply-templates select="TotalLiabilities"/> 
     <xsl:apply-templates select="TotalDeposits"/> 
     <xsl:apply-templates select="EquityCapital"/> 
    </xsl:template> 

    <xsl:template match="HoldingCo"> 
     <HoldingCo> 
      <xsl:text>Holding Co: </xsl:text> 
      <xsl:value-of select="."/> 
     </HoldingCo> 
    </xsl:template> 

    <xsl:template match="TotalAssets"> 
     <TotalAssets> 
      <xsl:text>Total Assets: </xsl:text> 
      <xsl:value-of select="."/> 
     </TotalAssets> 
    </xsl:template> 

    <xsl:template match="TotalLiabilities"> 
     <TotalLiabilities> 
      <xsl:text>Total Liabilities: </xsl:text> 
      <xsl:value-of select="."/> 
     </TotalLiabilities> 
    </xsl:template> 

    <xsl:template match="TotalDeposits"> 
     <TotalDeposits> 
      <xsl:text>Total Deposits: </xsl:text> 
      <xsl:value-of select="."/> 
     </TotalDeposits> 
    </xsl:template> 

    <xsl:template match="EquityCapital"> 
     <EquityCapital> 
      <xsl:text>Total Assets: </xsl:text> 
      <xsl:value-of select="."/> 
     </EquityCapital> 
    </xsl:template> 

    <xsl:template match="text()"/> 
</xsl:stylesheet> 

는 :

<root> 
    <story> 
     <CL> 
      <CityDescription>City One</CityDescription> 
      <BK> 
       <CompanyName>Corporate Name</CompanyName> 
       <address>123 Main St</address> 
       <HoldingCo>Company Name</HoldingCo> 
       <TotalAssets>128,319,000</TotalAssets> 
       <TotalLiabilities>117,059,000</TotalLiabilities> 
       <TotalDeposits>89,847,000</TotalDeposits> 
       <EquityCapital>11,260,000</EquityCapital> 
      </BK> 
      <BK> 
       <CompanyName>Smaller Company</CompanyName> 
       <address>123 Central St</address> 
      </BK> 
     </CL> 
     <CL> 
      <CityDescription>City Two</CityDescription> 
      <BK> 
       <CompanyName>Corporate Name Three</CompanyName> 
       <address>123 High St</address> 
       <HoldingCo>Company Name</HoldingCo> 
       <TotalAssets>128,319,000</TotalAssets> 
       <TotalLiabilities>117,059,000</TotalLiabilities> 
       <TotalDeposits>89,847,000</TotalDeposits> 
       <EquityCapital>11,260,000</EquityCapital> 
      </BK> 
      <BK> 
       <CompanyName>Smaller Company Four</CompanyName> 
       <address>123 Jones St</address> 
      </BK> 
     </CL> 
    </story> 
</root> 

는 원하는 생산 , 올바른 결과 :

그것으로 대체 될 수있다 -

<xsl:template match="BK"> 
    <xsl:value-of select="$vNL"/> 
    <xsl:apply-templates/> 
</xsl:template> 

동일 CL 템플레이트 매칭 유효 :

<root> 
    <story> 
     <CityDescription>City One</CityDescription> 

     <CompanyName>Corporate Name</CompanyName> 
     <address>123 Main St</address> 
     <HoldingCo>Holding Co: Company Name</HoldingCo> 
     <TotalAssets>Total Assets: 128,319,000</TotalAssets> 
     <TotalLiabilities>Total Liabilities: 117,059,000</TotalLiabilities> 
     <TotalDeposits>Total Deposits: 89,847,000</TotalDeposits> 
     <EquityCapital>Total Assets: 11,260,000</EquityCapital> 

     <CompanyName>Smaller Company</CompanyName> 
     <address>123 Central St</address> 
     <CityDescription>City Two</CityDescription> 

     <CompanyName>Corporate Name Three</CompanyName> 
     <address>123 High St</address> 
     <HoldingCo>Holding Co: Company Name</HoldingCo> 
     <TotalAssets>Total Assets: 128,319,000</TotalAssets> 
     <TotalLiabilities>Total Liabilities: 117,059,000</TotalLiabilities> 
     <TotalDeposits>Total Deposits: 89,847,000</TotalDeposits> 
     <EquityCapital>Total Assets: 11,260,000</EquityCapital> 

     <CompanyName>Smaller Company Four</CompanyName> 
     <address>123 Jones St</address> 
    </story> 
</root> 

BK의 하위 요소는 문서의 순서로 처리되기 때문에 (10)는 매칭 템플릿은 단순화 될 수있다 을 복사 정확하게 XSLT 가 내장되어 있기 때문에 모든 요소와 일치 템플릿

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

마지막으로,이 템플릿은 완전히 제거 할 수 있습니다.

따라서, 이들 리팩토링 후의 변환이다

<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:variable name="vNL" select="'&#xA;'"/> 
    <xsl:template match="/"> 
     <root> 
      <story> 
       <xsl:apply-templates select="root/story/CL"/> 
      </story> 
     </root> 
    </xsl:template> 

    <xsl:template match="CityDescription | CompanyName | address"> 
     <xsl:element name="{name()}"> 
      <xsl:value-of select="."/> 
     </xsl:element> 
    </xsl:template> 

    <xsl:template match="BK"> 
     <xsl:value-of select="$vNL"/> 
     <xsl:apply-templates/> 
    </xsl:template> 

    <xsl:template match="HoldingCo"> 
     <HoldingCo> 
      <xsl:text>Holding Co: </xsl:text> 
      <xsl:value-of select="."/> 
     </HoldingCo> 
    </xsl:template> 

    <xsl:template match="TotalAssets"> 
     <TotalAssets> 
      <xsl:text>Total Assets: </xsl:text> 
      <xsl:value-of select="."/> 
     </TotalAssets> 
    </xsl:template> 

    <xsl:template match="TotalLiabilities"> 
     <TotalLiabilities> 
      <xsl:text>Total Liabilities: </xsl:text> 
      <xsl:value-of select="."/> 
     </TotalLiabilities> 
    </xsl:template> 

    <xsl:template match="TotalDeposits"> 
     <TotalDeposits> 
      <xsl:text>Total Deposits: </xsl:text> 
      <xsl:value-of select="."/> 
     </TotalDeposits> 
    </xsl:template> 

    <xsl:template match="EquityCapital"> 
     <EquityCapital> 
      <xsl:text>Total Assets: </xsl:text> 
      <xsl:value-of select="."/> 
     </EquityCapital> 
    </xsl:template> 

    <xsl:template match="text()"/> 
</xsl:stylesheet> 

설명 :

다음 명령어

<xsl:apply-templates select="someChildName"/> 

만 템플릿을 적용한다 (프로세싱을 수행)를 someChildName 이프 자식 노드가 존재합니다.

+0

@Demitre 답변 주셔서 감사합니다. 그게 문제라고 생각했지만이 XML 유형의 템플릿을 사용하지 않았습니다. 언제든지 >> 다른 방법으로 선택 하시겠습니까? 또는 모든 노드에서 동일한 XML이 필요합니까? –

+0

@Demitre. 여기에 작성한 변수 이름에 익숙하지 않습니다. 임의의 이름입니까? 아니면 의미가 있습니까? select와 같은 엔티티 인 것 같습니다 ... –

+0

@JimMaivald : [Re : 어떤 경우라도 선택 하시겠습니까?] C/C#/C++/Java 등을 묻는다면 대답은 동일합니다 : "만약''(...) 그때 그 외의 다른 ... ''일을 할 것인가? ' –

관련 문제