2014-10-29 4 views
1

Мне нужна помощь с проблемой в моем коде xslt. Используется процессор/отладчик & IDE: (. Лесенки вниз только к элементам мне нужно для моего выбора) MSXML 6.0 в MS Visual Studio 2012.XSLT 1.0 получить отличные значения не удалось

Мой точный вход

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <components> 
    <Object3D id="130" plName="STF45668"/> 
    <Object3D id="131" plName="RIOD122"/> 
    <Object3D id="132" plName="RIOD122"/> 
    <Object3D id="133" plName="RIOD122"/> 
    <Object3D id="182" plName="RIOD124"/> 
    <Object3D id="183" plName="RIOD124"/> 
    <Object3D id="184" plName="RIOD124"/> 
    <Object3D id="185" plName="RIOD124"/> 
    </components> 
</root> 

Мой XSLT:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:msxsl="urn:schemas-microsoft-com:xslt"> 
    <xsl:key name ="objectsByName" use="/root/components/Object3D" match="@plName"/> 
    <xsl:output media-type="text"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
    <xsl:variable name="allObjs" select="//Object3D"/> 
    <xsl:variable name="distinctObjsCount" 
        select="//Object3D[count(. | key('objectsByName', @plName)[1]) = 1]"/> 
    <xsl:variable name="distinctObjsGenID" 
        select="//Object3D[generate-id() = 
          generate-id(key('objectsByName', @plName)[1])]"/> 

    <xsl:for-each select="//Object3D[count(. | key('objectsByName', @plName)[1]) = 1]"> 
     <xsl:value-of select="concat(@plName, '(',count(key('objectsByName', @plName)),')')"/> 
     <xsl:if test="position() != last()">, </xsl:if> 
    </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Это выход преобразование я получаю:

<?xml version="1.0" encoding="utf-8"?> 
STF45668(0), RIOD122(0), RIOD122(0), RIOD122(0), RIOD124(0), RIOD124(0), RIOD124(0), RIOD124(0) 

Но я не получаю отличные значения от этих объектов Object3D.

Итак ... Я понятия не имею, почему это происходит не так. У кого-нибудь есть идея, что я делаю неправильно?

Редактировать: теперь 1: 1 в файлы, которые я использую.

+0

Пожалуйста, покажите полную таблицу стилей XSLT, чтобы мы могли воспроизвести вашу проблему. Кроме того, был бы полезен полный ввод XML. Благодаря! –

+0

Я не думаю, что вы действительно этого хотите. Реальный входной файл имеет около 5 тыс. Строк генерируемого программой кода XML, файл xsl имеет около 4k строк. Это потому, что я создаю .odt-файл из готовых шаблонов -> огромные накладные расходы. Я могу добавить все атрибуты, релевантные для затронутых элементов. –

+0

Я не просил свалить все, что у вас есть. Но если вы хотите, чтобы люди отслеживали ошибку/несогласованность/неожиданный результат, вы действительно a) должны публиковать все или b) изолировать эту проблему в небольшом подмножестве вашего ввода и кода. В противном случае все ставки отключены. –

ответ

3

Ваши данные не подходят для меня. Правильный ввод XML будет что-то вроде:

<root> 
<components> 
    <Object3D plName="chair" /> 
    <Object3D plName="cup" /> 
    <Object3D plName="desk" /> 
    <Object3D plName="cup" /> 
    <Object3D plName="chair" /> 
    <Object3D plName="chair" /> 
    <Object3D plName="desk" /> 
    <Object3D plName="cup" /> 
</components> 
</root> 

И, следуя XSLT должно работать нормально с этим XML:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 
<xsl:key name="Object" match="Object3D" use="@plName"/> 

<xsl:template match="/root/components"> 
    <xsl:for-each select="Object3D[count(. | key('Object', @plName)[1]) = 1]"> 
     <xsl:value-of select="concat(@plName, '(',count(key('Object', @plName)),')')"/> 
     <xsl:if test="position() != last()">, </xsl:if> 
    </xsl:for-each> 
</xsl:template> 
</xsl:stylesheet> 

Ключи используются для группировки Object3D, а внутри для-каждого, формируя желаемый результат:

chair(3), cup(3), desk(2) 
+0

Это смешная часть моей проблемы. Этот выбор приводит к возврату всех элементов Object3D входного файла. Группирование не работает должным образом. Выходной сигнал приведенного выше кода: стул (0), стул (0), стул (0), чашка (0), чашка (0), чашка (0), стол (0), письменный стол (0) 0) Поверьте мне, я тоже удивлен результатом. –

+0

+1 для кода XSLT –

+1

@ steven.eisenreich Нет, это неправда - по крайней мере, с саксоном это работает точно так, как описано. С каким процессором вы работаете? –