MS Access XML удалить внешний ключ в родительских и дочерних отношениях - PullRequest
0 голосов
/ 04 февраля 2019

Я нашел похожий вопрос с моим потенциальным ответом несколько дней назад, но больше не могу его найти.

Мне удалось вывести нужный мне XML из Access с одним исключением.

<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2019- 02-03T16:38:41">
<CD-Export>
  <title>Empire Burlesque</title>
  <artist>Bob Dylan</artist>
  <country>USA</country>
  <company>Columbia</company>
  <price>10.9</price>
  <CD-Years-Export>
    <title>Empire Burlesque</title>
    <year>1985</year>
  </CD-Years-Export>
  <CD-Years-Export>
    <title>Empire Burlesque</title>
    <year>1986</year>
  </CD-Years-Export>
  <CD-Years-Export>
    <title>Empire Burlesque</title>
    <year>1987</year>
  </CD-Years-Export>
</CD-Export>

Полагаю, мне следует использовать файл XSLT для удаления внешнего ключа.

<title>
from the <CD-Years-Export> segment

Может кто-нибудь предоставить пример преобразования XSLT, которое можно использовать для удаления внешнего ключа из дочернего узла?

1 Ответ

0 голосов
/ 04 февраля 2019

Рассмотрим любой из следующих сценариев XSLT:

  • Пустой шаблон

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes"/>
        <xsl:strip-space elements="*"/>
    
        <!-- IDENTITY TRANSFORM -->
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <!-- EMPTY TEMPLATE TO REMOVE NODE -->
        <xsl:template match="CD-Years-Export/title"/>
    
    </xsl:stylesheet>
    
  • Исключить узел

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes"/>
        <xsl:strip-space elements="*"/>
    
        <!-- IDENTITY TRANSFORM -->
        <xsl:template match="@*|node()">
            <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="CD-Years-Export">
            <xsl:copy>
                <!-- EXCLUDE title NODE IN TREE REWRITE -->
                <xsl:apply-templates select="year"/>
            </xsl:copy>
        </xsl:template>
    
    </xsl:stylesheet>
    
  • Переписать родительский узел

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes"/>
        <xsl:strip-space elements="*"/>
    
        <!-- WALK DOWN TREE FROM ROOT -->
        <xsl:template match="dataroot">
            <xsl:copy>
                <xsl:apply-templates select="CD-Export"/>
            </xsl:copy>
        </xsl:template>
    
        <!-- COPY ALL BUT PARENT -->
        <xsl:template match="CD-Export">
            <xsl:copy>
                <xsl:copy-of select="*[name()!='CD-Years-Export']"/>
                <xsl:apply-templates select="CD-Years-Export"/>
            </xsl:copy>
        </xsl:template>
    
        <!-- RE-WRITE PARENT NODE -->
        <xsl:template match="CD-Years-Export">
            <xsl:copy>
                <xsl:copy-of select="year"/>
            </xsl:copy>
        </xsl:template>
    
    </xsl:stylesheet>
    
  • Метод Мюнхена (Группировка по отдельному названию)

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="3.0"     xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes"/>
        <xsl:strip-space elements="*"/>
    
        <xsl:key name="title_key" match="CD-Years-Export" use="title"/>
    
        <xsl:template match="dataroot">
            <xsl:copy>
                <xsl:apply-templates select="CD-Export"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="CD-Export">
            <xsl:copy>
                <xsl:copy-of select="*[name()!='CD-Years-Export']"/>
                <!-- ITERATE THROUGH EACH DISTINCT title -->
                <xsl:for-each select="CD-Years-Export[generate-id() =
                                         generate-id(key('title_key', title)[1])]">
                    <!-- RE-WRITE NODE FOR EACH DISTINCT title -->
                     <xsl:for-each select="key('title_key', title)">
                        <xsl:copy>
                            <xsl:copy-of select="year"/>
                        </xsl:copy>                           
                     </xsl:for-each>                     
                </xsl:for-each>
            </xsl:copy>
        </xsl:template>
    
    </xsl:stylesheet>
    
  • Метод Мюнхена (без xsl:for-each с использованием шаблонов режимов)

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes"/>
        <xsl:strip-space elements="*"/>
    
        <xsl:key name="title_key" match="CD-Years-Export" use="title"/>
    
        <xsl:template match="dataroot">
            <xsl:copy>
                <xsl:apply-templates select="CD-Export"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="CD-Export">
            <xsl:copy>
                <xsl:copy-of select="*[name()!='CD-Years-Export']"/>
                <!-- ITERATE THROUGH EACH DISTINCT title -->
                <xsl:apply-templates select="CD-Years-Export[generate-id() =
                                              generate-id(key('title_key', title)[1])]"/>
            </xsl:copy>
        </xsl:template>
    
        <xsl:template match="CD-Years-Export">
            <!-- RE-WRITE NODE FOR EACH DISTINCT title -->
            <xsl:apply-templates select="key('title_key', title)" mode="group"/>
        </xsl:template>
    
        <xsl:template match="CD-Years-Export" mode="group">
            <xsl:copy>
                <!-- RE-WRITE NODE FOR EACH DISTINCT title -->
                <xsl:copy-of select="year"/>
            </xsl:copy>
        </xsl:template>
    </xsl:stylesheet>
    
...