0

次の XML があります。

<EMPLOYEE_LIST>
   <EMPLOYEES>
      <EMPLOYEE>
         <EMPID>650000</EMPID>
         <FIRST_NAME>KEITH</FIRST_NAME>
         <MIDDLE_NAME>HUTCHINSON</MIDDLE_NAME>
         <LAST_NAME>ROGERS</LAST_NAME>
         .
         .
         .
         .
         <EMP_ADDR>
            <STREET>A</STREET>
            <CITY>B</CITY>
            <STATE> </STATE>
            <ZIP>90210</ZIP>
            <COUNTRY>C</COUNTRY>
         </EMP_ADDR> 
         <EMP_ADDR>
            <STREET>G</STREET>
            <CITY>H</CITY>
            <STATE>I</STATE>
            <ZIP> </ZIP>
            <COUNTRY> </COUNTRY>
         </EMP_ADDR>
       </EMPLOYEE>
    </EMPLOYEES>
</EMPLOYEE_LIST>

以下の出力が得られます。

<?xml version="1.0" encoding="UTF-8"?>
<employees>
      <employee>
         <emp_id>111345</emp_id>
         <f_name>KEITH</f_name>
         <m_name>HUTCHINSON</m_name>
         <l_name>ROGERS</l_name>
         .
         .
         .
         .
         <addresses>
            <addr>A</addr>
            <city>B</city>
            <province/>
            <postal>90210</postal>
            <country>C</country>
         </addresses>
         <addresses>
            <addr>G</addr>
            <city>H</city>
            <province>I</province>
            <postal/>
            <country/>
         </addresses>
      </employee>
</employees>

この XSLT を使用して変換すると、次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
        <xsl:template match="/EMPLOYEE_LIST">
            <employees>
                <xsl:apply-templates select="EMPLOYEES/node()"/>
            </employees>        
        </xsl:template>

        <xsl:template match="EMPLOYEE">
        <employee>
            <xsl:apply-templates select="*"/>
        </employee>
        </xsl:template>

        <xsl:template match="EMPLOYEE/EMPID">
        <emp_id>
            <xsl:value-of select="."/>
        </emp_id>
        </xsl:template>

        <xsl:template match="EMPLOYEE/FIRST_NAME">
        <f_name>
            <xsl:value-of select="."/>
        </f_name>
        </xsl:template>

        <xsl:template match="EMPLOYEE/MIDDLE_NAME">
            <m_name>
                <xsl:value-of select="."/>
            </m_name>
        </xsl:template>

        <xsl:template match="EMPLOYEE/LAST_NAME">
            <l_name>
                <xsl:value-of select="."/>
            </l_name>
        </xsl:template>
        .
        .
        .
        .
        .
       <xsl:template match="EMPLOYEE/EMP_ADDR[position() &lt; 5]">
        <addresses>
            <addr>
                <xsl:value-of select="normalize-space(STREET)"/>
            </addr>
            <city>
                <xsl:value-of select="normalize-space(CITY)"/>
            </city>
        <province>
                <xsl:value-of select="normalize-space(STATE)"/>
            </province>
            <postal>
                <xsl:value-of select="normalize-space(ZIP)"/>
            </postal>
            <country>
                <xsl:value-of select="normalize-space(COUNTRY)"/>
            </country>
        </addresses>
      </xsl:template>
</xsl:stylesheet>

次のように切り捨てられた/削除されたnullノードを含む出力が必要なため、これは私が達成しようとしているものではありません:

<?xml version="1.0" encoding="UTF-8"?>
<employees>
      <employee>
         <emp_id>111345</emp_id>
         <f_name>KEITH</f_name>
         <m_name>HUTCHINSON</m_name>
         <l_name>ROGERS</l_name>
         .
         .
         .
         .
         <addresses>
            <addr>A</addr>
            <city>B</city>
            <postal>90210</postal>
            <country>C</country>
         </addresses>
         <addresses>
            <addr>G</addr>
            <city>H</city>
            <province>I</province>
         </addresses>
      </employee>
</employees>

それを行う方法はありますか、誰かが私を手伝ってくれますか?

ありがとう

4

1 に答える 1

0

Probably the simplest way is to change the end of your stylesheet to something like this:

<xsl:template match="EMPLOYEE/EMP_ADDR[position() &lt; 5]">
    <addresses>
        <xsl:apply-templates select="STREET"/>
        <xsl:apply-templates select="CITY"/>
        <xsl:apply-templates select="STATE"/>
        <xsl:apply-templates select="ZIP"/>
        <xsl:apply-templates select="COUNTRY"/>
    </addresses>
</xsl:template>

<xsl:template match="STREET">
    <addr>
        <xsl:value-of select="normalize-space(.)"/>
    </addr>
</xsl:template>

<xsl:template match="CITY">
    <city>
        <xsl:value-of select="normalize-space(.)"/>
    </city>
</xsl:template>

<xsl:template match="STATE">
    <province>
        <xsl:value-of select="normalize-space(.)"/>
    </province>
</xsl:template>

<xsl:template match="ZIP">
    <postal>
        <xsl:value-of select="normalize-space(.)"/>
    </postal>
</xsl:template>

<xsl:template match="COUNTRY">
    <country>
        <xsl:value-of select="normalize-space(.)"/>
    </country>
</xsl:template>

<!--
Drop elements that don't have any text content after whitespace normalization
-->
<xsl:template match="*[not(normalize-space(.))]"/>

This assumes you want to drop empty elements everywhere in the document. If you only want to drop empty children of <EMP_ADDR> elements, you can use <xsl:template match="EMP_ADDR/*[not(normalize-space(.))]"/>.

于 2013-03-01T10:06:40.750 に答える