Невозможно изменить значение атрибута XSL с помощью Java

У меня есть файл XSL, в котором я хочу обновить значение тега атрибута, используя код Джава. Это мой файл XSL: -

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
    xmlns:fo = "http://www.w3.org/1999/XSL/Format"
    version = "2.0">

    <xsl:attribute-set name = "__frontmatter">
        <xsl:attribute name = "text-align">center</xsl:attribute>
    </xsl:attribute-set>
</xsl:stylesheet>

Я хочу прочитать родительский тег "__frontmatter", затем под этим тегом дочернего узла "text-align" и обновить значение center.

Я знаю, что нужно читать имя узла из файла XML, но это меня смущает, как я буду читать xsl:attribute-set и name = "xyz" из кода Java?

Обновлено:- Метод добавления.

private static void updateElementValue(Document doc) {
        String a = "right";
        NodeList frontmatterr = doc.getElementsByTagName("text-align");
        Element e = null;
        for(int i=0; i<frontmatterr.getLength();i++){
            e = (Element) frontmatterr.item(i);
            Node name = emp.getElementsByTagName("text-align").item(0).getFirstChild();
            name.setNodeValue(name.getNodeValue().valueOf(a));
        }
    }

Мой код Java, в котором я пытаюсь прочитать узел xsl.

Ваш вопрос непонятен. Вы пытаетесь изменить XSL (как XML-документ) из программы Java? Или вы пытаетесь использовать XSL в программе Java и перехватить ее обработку во время выполнения, чтобы изменить ее поведение? Первое сделать легко, просто относитесь к XSL как к XML-документу. Второй - немного сложнее. Вам нужно будет загрузить XSL как XML-документ, изменить его DOM, а затем использовать его для создания экземпляра Transformer.

Jim Garrison 16.08.2018 08:55

@JimGarrison Я пытаюсь сделать первый, изменить XSL из Java-программы. Я показал свой XSL-файл <xsl:attribute name = "text-align">center</xsl:attribute>. Я столкнулся с проблемой чтения узла <xsl:attribute> из-за :. В отличие от XML, имя узла непростое.

WhoAmI 16.08.2018 09:26

Самый простой подход к преобразованию XSLT с помощью программы Java - использовать Java для запуска второго XSLT, выполняющего преобразование. Если вы не хотите использовать XSLT, вам необходимо объяснить, какой Java API (DOM, JDOM, XOM, SAX) вы пытаетесь использовать, и показать нам этот код.

Martin Honnen 16.08.2018 10:50

@MartinHonnen Я не могу использовать другой файл XSLT, так как он всегда будет жестко закодирован. сценарий тот же, либо я изменяю этот файл, либо этот файл. Я не понимаю, как мне прочитать атрибут name = "text-align" и изменить его на какое-то другое значение из полей ввода.

WhoAmI 16.08.2018 11:10

Вы хотя бы знаете XPath и подумывали о выборе, например, xsl:stylesheet/xsl:attribute-set[@name = '__frontmatter']/xsl:attribute[@name = 'text-align'] с XPath, а затем установка setTextContent("right")?

Martin Honnen 16.08.2018 11:33

@MartinHonnen Нет, я понятия не имею о Xpath. Дай мне попробовать.

WhoAmI 16.08.2018 12:12
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
133
1

Ответы 1

Хотя вы говорите в своем комментарии, что «не можете использовать другой файл XSLT», я думаю, что XSLT - правильный инструмент для управления XSLT, поэтому я публикую здесь предложение с помощью XSLT

<?xml version = "1.0" encoding = "UTF-8"?>
<xsl:stylesheet
    xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
    version = "1.0">

  <xsl:param name = "new-text-align">right</xsl:param>

  <xsl:template match = "@* | node()">
    <xsl:copy>
      <xsl:apply-templates select = "@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match = "xsl:attribute-set[@name = '__frontmatter']/xsl:attribute[@name = 'text-align']">
      <xsl:copy>
          <xsl:copy-of select = "@*"/>
          <xsl:value-of select = "$new-text-align"/>
      </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

онлайн на https://xsltfiddle.liberty-development.net/bdxtqo/1, вы можете преобразовать исходный XSLT, который вам нужен

<xsl:stylesheet version = "2.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform" xmlns:fo = "http://www.w3.org/1999/XSL/Format">

    <xsl:attribute-set name = "__frontmatter">
        <xsl:attribute name = "text-align">right</xsl:attribute>
    </xsl:attribute-set>
</xsl:stylesheet>

в Java JAXP API вы должны просто настроить Transformerhttps://docs.oracle.com/javase/8/docs/api/javax/xml/transform/Transformer.html с указанным выше XSLT в качестве источника (https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTransformer-javax.xml.transform.Source-) и использовать исходный XSLT в качестве входного Source и получить новый XSLT как Result метода transform.

Это полезно, спасибо за подробный ответ. но мне нужно добиться этого с помощью java-кода. Таких полей у меня много.

WhoAmI 16.08.2018 12:21

Как вы уже упоминали в приведенной выше ссылке <xsl:param name = "new-text-align">center</xsl:param>. Как мне добиться этого с помощью кода Java. Как и в Dropbox, выберите опцию right, и она должна получить <xsl:param name = "new-text-align">right</xsl:param>.

WhoAmI 21.08.2018 14:16

Другие вопросы по теме