У меня есть файл 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.
@JimGarrison Я пытаюсь сделать первый, изменить XSL из Java-программы. Я показал свой XSL-файл <xsl:attribute name = "text-align">center</xsl:attribute>. Я столкнулся с проблемой чтения узла <xsl:attribute> из-за :. В отличие от XML, имя узла непростое.
Самый простой подход к преобразованию XSLT с помощью программы Java - использовать Java для запуска второго XSLT, выполняющего преобразование. Если вы не хотите использовать XSLT, вам необходимо объяснить, какой Java API (DOM, JDOM, XOM, SAX) вы пытаетесь использовать, и показать нам этот код.
@MartinHonnen Я не могу использовать другой файл XSLT, так как он всегда будет жестко закодирован. сценарий тот же, либо я изменяю этот файл, либо этот файл. Я не понимаю, как мне прочитать атрибут name = "text-align" и изменить его на какое-то другое значение из полей ввода.
Вы хотя бы знаете XPath и подумывали о выборе, например, xsl:stylesheet/xsl:attribute-set[@name = '__frontmatter']/xsl:attribute[@name = 'text-align'] с XPath, а затем установка setTextContent("right")?
См. docs.oracle.com/javase/tutorial/jaxp/xslt/xpath.html и docs.oracle.com/javase/8/docs/api/javax/xml/xpath/….
@MartinHonnen Нет, я понятия не имею о Xpath. Дай мне попробовать.




Хотя вы говорите в своем комментарии, что «не можете использовать другой файл 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-кода. Таких полей у меня много.
Как вы уже упоминали в приведенной выше ссылке <xsl:param name = "new-text-align">center</xsl:param>. Как мне добиться этого с помощью кода Java. Как и в Dropbox, выберите опцию right, и она должна получить <xsl:param name = "new-text-align">right</xsl:param>.
Ваш вопрос непонятен. Вы пытаетесь изменить XSL (как XML-документ) из программы Java? Или вы пытаетесь использовать XSL в программе Java и перехватить ее обработку во время выполнения, чтобы изменить ее поведение? Первое сделать легко, просто относитесь к XSL как к XML-документу. Второй - немного сложнее. Вам нужно будет загрузить XSL как XML-документ, изменить его DOM, а затем использовать его для создания экземпляра
Transformer.