Как я сохраняю теги разметки?

То, что вам не хватает, - это cellValueFactory для ваших столбцов, которые будут сообщать столбцу, какое значение будет отображаться в его ячейках.

Что-то вроде этого:

TableView> tableView = new TableView<>();
List columnNames = dataGenerator.getNext(N_COLS);
for (int i = 0; i < columnNames.size(); i++) {
    final int finalIdx = i;
    TableColumn, String> column = new TableColumn<>(
            columnNames.get(i)
    );
    column.setCellValueFactory(param ->
            new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
    );
    tableView.getColumns().add(column);
}

Пример приложения

Это решение было немного основано на сообщении блога Narayan: Обновлено: Динамические данные TableView из базы данных . Вместо этого сообщения в блоге это решение использует генератор тестовых данных для генерации некоторых фиктивных данных и некоторых функций лямбда Java 8, которые делают заводское определение значения ячейки немного менее громоздким для записи и просмотра.

import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

import java.util.*;

public class DynamicTableView extends Application {    
    private static final int N_COLS = 5;
    private static final int N_ROWS = 1_000;

    public void start(Stage stage) throws Exception {
        TestDataGenerator dataGenerator = new TestDataGenerator();

        TableView> tableView = new TableView<>();

        // add columns
        List columnNames = dataGenerator.getNext(N_COLS);
        for (int i = 0; i < columnNames.size(); i++) {
            final int finalIdx = i;
            TableColumn, String> column = new TableColumn<>(
                    columnNames.get(i)
            );
            column.setCellValueFactory(param ->
                    new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
            );
            tableView.getColumns().add(column);
        }

        // add data
        for (int i = 0; i < N_ROWS; i++) {
            tableView.getItems().add(
                    FXCollections.observableArrayList(
                            dataGenerator.getNext(N_COLS)
                    )
            );
        }

        tableView.setPrefHeight(200);

        Scene scene = new Scene(tableView);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    private static class TestDataGenerator {
        private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" ");

        private int curWord = 0;

        List getNext(int nWords) {
            List words = new ArrayList<>();

            for (int i = 0; i < nWords; i++) {
                if (curWord == Integer.MAX_VALUE) {
                    curWord = 0;
                }

                words.add(LOREM[curWord % LOREM.length]);
                curWord++;
            }

            return words;
        }
    }
}

17
задан Mathias Müller 31 March 2014 в 12:25
поделиться

5 ответов

Попытайтесь использовать

<xsl:copy-of select="body"/>

вместо этого. От w3schools' документация относительно того же :

<xsl:copy-of> элемент создает копию текущего узла.

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

24
ответ дан 30 November 2019 в 12:45
поделиться

Если Вы не управляете входным документом, копия - должна работать:

От http://www.xml.com/pub/a/2000/06/07/transforming/index.html

"Xsl:copy элемент, с другой стороны, может скопировать все поддерево каждого узла, который выбирает шаблон. Это включает атрибуты, если избранный атрибут xsl:copy элемента имеет соответствующее значение. В следующем примере шаблон копирует узлы элемента заголовка и все их порожденные узлы - другими словами, полные элементы заголовка, включая их теги, подэлементы и атрибуты":

<xsl:template match="title">
  <xsl:copy-of select="*"/>
</xsl:template>
4
ответ дан 30 November 2019 в 12:45
поделиться

Если Вы управляете входным документом, , CDATA является правильным способом пойти.

1
ответ дан 30 November 2019 в 12:45
поделиться

Значение элемента XML - это верно не только в XSLT, но и в реализациях DOM - конкатенация всех ее порожденных текстовых узлов. В XSLT, value-of испускает значение элемента, в то время как copy-of испускает копию элемента.

1
ответ дан 30 November 2019 в 12:45
поделиться

Это - потому что механизм интерпретирует < p> тег (исключая его для вывода). Необходимо определить желание содержания, "как это", с помощью "disable-output-escaping=yes|no" атрибут.

<xsl:value-of select="body" disable-output-escaping="yes"/>
-1
ответ дан 30 November 2019 в 12:45
поделиться
Другие вопросы по тегам:

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