XSL 1.0 Различается через Munchian и несколько режимов матча

Мне просто интересно, почему мы не можем вызвать await изнутри конструктора напрямую.

blockquote>

Я считаю, что короткий ответ просто: потому что команда .Net не запрограммировал эту функцию.

Я считаю, что с правильным синтаксисом это может быть реализовано и не должно быть слишком запутанным или подверженным ошибкам. Я думаю, что сообщение в блоге Стивена Клири и несколько других ответов здесь неявно отметили, что нет основополагающей причины для этого, и более того - решена нехватка обходных решений. Существование этих относительно простых обходных решений, вероятно, является одной из причин, почему эта функция еще не реализована.

1
задан user412632 6 August 2010 в 04:02
поделиться

2 ответа

Однако при добавлении режимов то же самое перевод не выполняется?

Проблема в этом коде :

 
 
 
 
 
 
 



Приведенная выше инструкция:

<xsl:apply-templates mode="ucatmode"/>

- это сокращение от;

<xsl:apply-templates select="child::node()"
     mode="ucatmode"/>

Однако дочерние элементы набора данных - это только элементы с именем node и текстовые узлы, содержащие только пробелы. . В вашем коде нет шаблона, который находится в режиме с именем ucatmode и соответствует элементу node .

Следовательно, для обработки не выбирается никакой шаблон, и XSLT-процессор использует встроенные шаблоны (они доступны для любого режима). Встроенные шаблоны XSLT заставляют копировать все текстовые узлы - и это то, что вы получаете.

Точно такая же проблема существует с инструкцией :

<xsl:apply-templates mode="catmode"/>

Решение : Замените:

<xsl:template match="dataset">
    <UCAT>
        <xsl:apply-templates mode="ucatmode"/>
    </UCAT>
    <DCAT>
        <xsl:apply-templates mode="catmode"/>
    </DCAT>
</xsl:template>

на

<xsl:template match="/">
    <UCAT>
        <xsl:apply-templates mode="ucatmode"/>
    </UCAT>
    <DCAT>
        <xsl:apply-templates mode="catmode"/>
    </DCAT>
</xsl:template>

Этот шаблон теперь соответствует узлу документа, его единственным (верхним) дочерним элементом является dataset и два модифицированных шаблона, соответствующие набору данных , теперь будут выбраны для обработки.

Вам все равно нужно заменить:

<xsl:apply-templates mode="catmode"/>

на:

    <xsl:apply-templates mode="catmode"
         select="dataset/node/desc"/>

, потому что desc не является дочерним элементом набора данных , и для всех потомков снова будет задействована встроенная обработка шаблонов. из набора данных , за исключением desc .

Одно небольшое дополнительное исправление состоит в том, чтобы удалить все текстовые узлы, состоящие только из пробелов - это удобно сделать с помощью следующей инструкции XSLT:

<xsl:strip-space elements="*"/>

Еще одно небольшое улучшение - предотвратить exslt: префикс от появления с каждым элементом literal-result. Это достигается путем добавления атрибута:

exclude-result-prefixes="exslt"

к инструкции .

Полное исправленное преобразование (с правильным отступом для удобочитаемости), таким образом, выглядит следующим образом: :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:exslt="http://exslt.org/common"
 exclude-result-prefixes="exslt"
 >
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="nodekey" match="node/category"
    use="concat(@catat,'_',@catatt)"/>

    <xsl:template match="/">
        <UCAT>
            <xsl:apply-templates mode="ucatmode"/>
        </UCAT>
        <DCAT>
            <xsl:apply-templates mode="catmode"
                 select="dataset/node/desc"/>
        </DCAT>
    </xsl:template>

    <xsl:template match="dataset" mode="ucatmode">
        <DESC>
            <xsl:for-each select=
             "node/category
                   [generate-id()
                   =
                    generate-id(key('nodekey',
                                     concat(@catat,'_',@catatt)
                                     )[1]
                                )
                    ]">
                <CAT_D>
                    <xsl:value-of select="concat(@catat,'_',@catatt)"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="."/>
                </CAT_D>
            </xsl:for-each>
        </DESC>
    </xsl:template>

    <xsl:template match="dataset/node/desc" mode="catmode">
        <CATQ>
            <xsl:value-of select="."/>
        </CATQ>
    </xsl:template>
</xsl:stylesheet>

Когда оно применяется к предоставленному XML-документу :

<dataset>
    <node>
        <category comat="0" catat="AC1" catatt="AD1">C1</category>
        <desc>D1</desc>
    </node>
    <node>
        <category comat="0" catat="AC2" catatt="AD2">C2</category>
        <desc>D2</desc>
    </node>
    <node>
        <category comat="0" catat="AC1" catatt="AD1">C1</category>
        <desc>D1</desc>
    </node>
    <node>
        <category comat="0" catat="AC3" catatt="AD3">C3</category>
        <desc>D3</desc>
    </node>
</dataset>

получается требуемый правильный результат :

<UCAT>
   <DESC>
      <CAT_D>AC1_AD1_C1</CAT_D>
      <CAT_D>AC2_AD2_C2</CAT_D>
      <CAT_D>AC3_AD3_C3</CAT_D>
   </DESC>
</UCAT>
<DCAT>
   <CATQ>D1</CATQ>
   <CATQ>D2</CATQ>
   <CATQ>D1</CATQ>
   <CATQ>D3</CATQ>
</DCAT>
2
ответ дан 2 September 2019 в 22:22
поделиться

Спасибо, Дмитрий, ваши предложения сработали так, как описано.

Добавление формального решения для справки.

<?xml version="1.0" encoding="ISO-8859-1"?>
  <xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:exslt="http://exslt.org/common" exclude-result-prefixes="exslt" >
   <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="distinct-CompositeKeyNOS" match="Downloads/Download[@ParentDownloadID='0']" use="concat(@Version,'_',@DownloadType,'_',@Name,'_',@IsBeta)"/>
<xsl:template match="/">
<NotifiusExportData>

            <xsl:apply-templates mode="OSAgnostic">
    </xsl:apply-templates> 

            <xsl:apply-templates mode="english">
    </xsl:apply-templates> 

            <xsl:apply-templates mode="DevicesLangCodes">
    </xsl:apply-templates> 
</NotifiusExportData>
</xsl:template>



    <xsl:template match="NotifiusExportData" mode="OSAgnostic">

        <xsl:for-each select="Downloads/Download[generate-id()= generate-id(key('distinct-CompositeKeyNOS',concat(@Version,'_',@DownloadType,'_',@Name,'_',@IsBeta))[1])]">
                <xsl:sort select="@Version" order="descending" data-type="number"/>
                <xsl:sort select="@DownloadType" order="ascending"/>
                <xsl:sort select="@Name" order="ascending"/>
                <xsl:sort select="@OS" order="descending" data-type="number"/>
                <xsl:sort select="@Is64Bit" order="descending" data-type="number"/>
                <xsl:sort select="@IsBeta" order="ascending" data-type="number"/>
            <Downloads>
                <CompositeKeyNOS>
                    <xsl:value-of select="@Version"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@DownloadType"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@Name"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@IsBeta"/>
                </CompositeKeyNOS>
                <CompositeKey>
                    <xsl:value-of select="@Version"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@DownloadType"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@Name"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@OS"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@Is64Bit"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@IsBeta"/>
                </CompositeKey>
                <ParentDownloadID>
                    <xsl:value-of select="@ParentDownloadID"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@OS"/>
                </ParentDownloadID>
                <DownloadId>
                    <xsl:value-of select="@DownloadId"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@OS"/>
                </DownloadId>
                <Release>
                    <xsl:value-of select="@Release"/>
                </Release>
                <Version>
                    <xsl:value-of select="@Version"/>
                </Version>
                <DetailsURL>
                    <xsl:value-of select="@DetailsURL"/>
                </DetailsURL>
                <IsBeta>
                    <xsl:value-of select="@IsBeta"/>
                </IsBeta>
                <ReleaseDate>
                    <xsl:value-of select="@ReleaseDate"/>
                </ReleaseDate>
                <DownloadType>
                    <xsl:value-of select="@DownloadType"/>
                </DownloadType>
                <OS>
                    <xsl:value-of select="@OS"/>
                </OS>
                <Is64Bit>
                    <xsl:value-of select="@Is64Bit"/>
                </Is64Bit>
                <LangCode5>
                    <xsl:value-of select="@LangCode5"/>
                </LangCode5>
                <Name>
                    <xsl:value-of select="@Name"/>
                </Name>
                <GraphicsVersion>
                    <xsl:value-of select="@GraphicsVersion"/>
                </GraphicsVersion>
                <USBEmitterVersion>
                    <xsl:value-of select="@USBEmitterVersion"/>
                </USBEmitterVersion>
            </Downloads>

        </xsl:for-each>

    </xsl:template>


    <xsl:template match="NotifiusExportData/Downloads" mode="english"><!-- xsl:for-each select="." --><!--xsl:if test="@ParentDownloadID=0"-->
        <xsl:for-each select="Download[@ParentDownloadID='0']">
            <xsl:sort select="@Version" order="descending" data-type="number"/>
            <xsl:sort select="@DownloadType" order="ascending"/>
            <xsl:sort select="@Name" order="ascending"/>
            <xsl:sort select="@OS" order="descending" data-type="number"/>
            <xsl:sort select="@Is64Bit" order="descending" data-type="number"/>
            <xsl:sort select="@IsBeta" order="ascending" data-type="number"/>
            <NDownloads>
                <NCompositeKeyNOS>
                    <xsl:value-of select="@Version"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@DownloadType"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@Name"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@IsBeta"/>
                </NCompositeKeyNOS>
                <NCompositeKey>
                    <xsl:value-of select="@Version"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@DownloadType"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@Name"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@OS"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@Is64Bit"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@IsBeta"/>
                </NCompositeKey>
                <ParentDownloadID>
                    <xsl:value-of select="@ParentDownloadID"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@OS"/>
                </ParentDownloadID>
                <DownloadId>
                    <xsl:value-of select="@DownloadId"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@OS"/>
                </DownloadId>
                <Release>
                    <xsl:value-of select="@Release"/>
                </Release>
                <Version>
                    <xsl:value-of select="@Version"/>
                </Version>
                <DetailsURL>
                    <xsl:value-of select="@DetailsURL"/>
                </DetailsURL>
                <IsBeta>
                    <xsl:value-of select="@IsBeta"/>
                </IsBeta>
                <ReleaseDate>
                    <xsl:value-of select="@ReleaseDate"/>
                </ReleaseDate>
                <DownloadType>
                    <xsl:value-of select="@DownloadType"/>
                </DownloadType>
                <OS>
                    <xsl:value-of select="@OS"/>
                </OS>
                <Is64Bit>
                    <xsl:value-of select="@Is64Bit"/>
                </Is64Bit>
                <LangCode5>
                    <xsl:value-of select="@LangCode5"/>
                </LangCode5>
                <Name>
                    <xsl:value-of select="@Name"/>
                </Name>
                <GraphicsVersion>
                    <xsl:value-of select="@GraphicsVersion"/>
                </GraphicsVersion>
                <USBEmitterVersion>
                    <xsl:value-of select="@USBEmitterVersion"/>
                </USBEmitterVersion>
            </NDownloads><!--/xsl:if --><!-- /xsl:for-each -->
        </xsl:for-each>
    </xsl:template><!-- xsl:template match="Download" mode="DevicesLangCodes" -->



<!-- xsl:template match="Download" mode="DevicesLangCodes" -->

    <xsl:template match="NotifiusExportData/Downloads" mode="DevicesLangCodes"><!-- xsl:for-each select="." --><!-- xsl:if test="@ParentDownloadID!=0" -->
        <xsl:for-each select="Download">
            <xsl:sort select="@Version" order="descending" data-type="number"/>
            <xsl:sort select="@DownloadType" order="ascending"/>
            <xsl:sort select="@Name" order="ascending"/>
            <xsl:sort select="@LangCode5" order="ascending"/>
            <xsl:sort select="@OS" order="descending" data-type="number"/>
            <xsl:sort select="@Is64Bit" order="descending" data-type="number"/>
            <xsl:sort select="@IsBeta" order="ascending" data-type="number"/>
            <NNDownloads>
                <NNCompositeKeyNOS>
                    <xsl:value-of select="@Version"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@DownloadType"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@Name"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@IsBeta"/>
                </NNCompositeKeyNOS>
                <NNCompositeKey>
                    <xsl:value-of select="@Version"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@DownloadType"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@Name"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@OS"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@Is64Bit"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@IsBeta"/>
                </NNCompositeKey>
                <NParentDownloadID>
                    <xsl:value-of select="@ParentDownloadID"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@OS"/>
                </NParentDownloadID>
                <NDownloadId>
                    <xsl:value-of select="@DownloadId"/>
                    <xsl:text>_</xsl:text>
                    <xsl:value-of select="@OS"/>
                </NDownloadId>
                <NLangCode5>
                    <xsl:value-of select="@LangCode5"/>
                </NLangCode5>
                <xsl:call-template name="groupLangCodes"/>
                <xsl:call-template name="groupDeviceIds"/>
            </NNDownloads>
        </xsl:for-each>
    </xsl:template>
    <xsl:template name="groupLangCodes" match="LangCodes">
        <LangCodes>
            <xsl:call-template name="getLangCodeIds"/>
        </LangCodes>
    </xsl:template>
    <xsl:template name="groupDeviceIds" match="DeviceIds">
        <DeviceIds>
            <xsl:call-template name="getDeviceIds"/>
        </DeviceIds>
    </xsl:template>
    <xsl:template name="getLangCodeIds">
        <xsl:for-each select="LangCodes/LangCode">
            <xsl:value-of select="@Id"/>
            <xsl:text> </xsl:text>
        </xsl:for-each>
    </xsl:template>
    <xsl:template name="getDeviceIds">
        <xsl:for-each select="DeviceIds/DeviceId">
            <xsl:value-of select="@Id"/>
            <xsl:text> </xsl:text>
        </xsl:for-each>
    </xsl:template>

  </xsl:stylesheet>
0
ответ дан 2 September 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: