Arhn - архитектура программирования

Порядок сортировки XSLT для соответствия порядку другого родительского узла

У меня есть два узла, которые случайно разделяют подмножество своих данных. Мне нужно отсортировать первый набор на основе исходного порядка второго.

В качестве примера рассмотрим следующие наборы точек и линий. Каждая «начальная» и «конечная» точка для каждой линии в любом случае также будет указана в списке точек.

<Points>
    <Point name="Point1">0 0</Point>
    <Point name="Point2">0 1</Point>
    <Point name="Point3">1 1</Point>
    <Point name="Point4">1 0</Point>
</Points>

<Shape>
    <Line name="Line1">
        <Start>0 0</Start>
        <End>0 1</End>
    </Line>
    <Line name="Line2">
        <Start>0 1</Start>
        <End>1 1</End>
    </Line>
    <Line name="Line3">
        <Start>1 1</Start>
        <End>1 0</End>
    </Line>
    <Line name="Line4">
        <Start>1 0</Start>
        <End>0 0</End>
    </Line>
</Shape>

Мне нужно отсортировать точки так, чтобы значения соответствовали тому же порядку, что и конечные точки, указанные для формы.

Для приведенного выше примера ожидаемый результат XSLT будет следующим...

Point2 0 1
Point3 1 1
Point4 1 0
Point1 0 0

Если быть точным, я работаю с объектами COGO Points и Alignment из AutoCAD, пытаясь настроить отчеты на основе выходных данных LandXML из Civil3D. Образец выше просто дает мне некоторое направление. Любая помощь будет принята с благодарностью.

10.06.2015

  • Какая версия XSLT? 10.06.2015
  • XSLT версии 1.0. Я использую Autodesk LandXML Reporting 8.0 для обработки файлов. 10.06.2015
  • Что, если Концов больше, чем Точек? 10.06.2015
  • Из-за того, как генерируются XML-файлы, всегда будет одинаковое количество точек и концов. Я выбираю трассу из своего рисунка, созданного по точкам. Проблема в том, что точки не записываются в XML-файле в том же порядке, если только они специально не выбраны на чертеже как таковые, что не всегда удобно делать. 10.06.2015

Ответы:


1

Я думаю, это должно сработать: шаблон, который соответствует узлам End, и захватывает узел Point с тем же текстовым значением (есть второй шаблон, соответствующий всем узлам text(), чтобы убедиться, что он не будет выведен непреднамеренно):

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:template match="/root/Shape/Line/End">
        <xsl:variable name="endPtText" select="./text()" />
        <xsl:value-of select="/root/Points/Point[text() = $endPtText]/@name" /><xsl:text> </xsl:text><xsl:value-of select="$endPtText"/> <xsl:text>
</xsl:text>
    </xsl:template>

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

Производит:

Point2 0 1
Point3 1 1
Point4 1 0
Point1 0 0

из:

<root>
  <Points>
    <Point name="Point1">0 0</Point>
    <Point name="Point2">0 1</Point>
    <Point name="Point3">1 1</Point>
    <Point name="Point4">1 0</Point>
  </Points>

  <Shape>
    <Line name="Line1">
        <Start>0 0</Start>
        <End>0 1</End>
    </Line>
    <Line name="Line2">
        <Start>0 1</Start>
        <End>1 1</End>
    </Line>
    <Line name="Line3">
        <Start>1 1</Start>
        <End>1 0</End>
    </Line>
    <Line name="Line4">
        <Start>1 0</Start>
        <End>0 0</End>
    </Line>
  </Shape>
</root>        

XSLTransform

Просто обратите внимание, что если у вас есть два идентичных текстовых узла Point, это не сработает, и если у вас нет узла Point, соответствующего узлу End, это не сработает.

10.06.2015
  • Это именно то, что мне было нужно. Благодарю вас! 10.06.2015
  • Нет проблем, но, как я упоминал в посте, имейте в виду, что если у вас есть два узла Point с одинаковым текстовым значением, это может дать вам непредвиденные результаты. 10.06.2015
  • Ввод точек требует, чтобы они были уникальными, так что это не должно вызывать беспокойства. Спасибо еще раз :) 10.06.2015

  • 2

    всегда будет такое же количество точек, как и концов.

    В таком случае проблема может быть переформулирована как:

    Перечислите все конечные точки в порядке документа вместе с соответствующим именем точки.

    Для этого лучше всего использовать ключ — например (упрощено для иллюстрации принципа):

    XSLT 1.0

    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    
    <xsl:key name="pt" match="Point" use="." />
    
    <xsl:template match="/root">
        <xsl:copy>
            <xsl:for-each select="Shape/Line">
                <xsl:copy-of select="key('pt', End)"/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>
    

    Результат:

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
      <Point name="Point2">0 1</Point>
      <Point name="Point3">1 1</Point>
      <Point name="Point4">1 0</Point>
      <Point name="Point1">0 0</Point>
    </root>
    
    10.06.2015
  • Ах, да, ключ намного элегантнее, чем мое решение. 10.06.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..


    © 2024 arhn.ru, Arhn - архитектура программирования