XSLT дочерние элементы

У меня есть XML-документ следующим образом:

<OrdersSchedulePDFView>
   <OrdersSchedulePDFViewRow>      
      <Items>
         <ItemDesc>Content1</ItemDesc>
         <ItemDesc>Content2</ItemDesc>
      </Items>
      <Locations>
         <LocName>Content3</LocName>
         <LocName>Content4</LocName>
      </Locations>
   </OrdersSchedulePDFViewRow>
</OrdersSchedulePDFView>

Пожалуйста, дайте мне пример файла xsl, где я могу получить элементы ItemDesc и LocName через шаблон. Заранее спасибо Это мой xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">   
<xsl:template match="OrdersSchedulePDFView">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">        
        <xsl:for-each select="OrdersSchedulePDFViewRow">       
        <fo:page-sequence master-reference="all">           
            <fo:flow flow-name="xsl-region-body">                               
                <xsl:template match="Locations">
                    <xsl:copy>
                        <xsl:apply-templates select="LocName"/>
                    </xsl:copy>
                </xsl:template>             
                <xsl:template match="Items">                                                        
                    <xsl:copy>
                        <xsl:apply-templates select="ItemDesc"/>
                    </xsl:copy>
                </xsl:template>         
            </fo:flow>
        </fo:page-sequence>
        </xsl:for-each>
    </fo:root>
</xsl:template>
</xsl:stylesheet>

person Вячеслав Кошман    schedule 25.04.2017    source источник
comment
Что именно ты пытаешься сделать? вы можете попробовать <xsl:template match="LocName"> (если для элементов, которые мы, возможно, не видим, нет пространства имен), но что должен делать шаблон?   -  person Stefan Hegny    schedule 25.04.2017
comment
Мне нужно распечатать элементы ItemDesc и LocName. Но я не могу получить их через ‹xsl:template match=OrdersSchedulePDFViewRow› ‹xsl:value-of select=LocName/›   -  person Вячеслав Кошман    schedule 25.04.2017
comment
Почему бы вам не опубликовать свою попытку, чтобы мы могли ее исправить, вместо того, чтобы писать код для вас с нуля. Кроме того, покажите точный результат, который вы ожидаете получить.   -  person michael.hor257k    schedule 25.04.2017
comment
Когда я пытаюсь добавить весь документ, я получаю сообщение о том, что слишком много кода   -  person Вячеслав Кошман    schedule 25.04.2017
comment
Затем сверните - см.: минимальный воспроизводимый пример   -  person michael.hor257k    schedule 25.04.2017
comment
попробуйте <xsl:template match="OrdersSchedulePDFViewRow"> <xsl:value-of select="OrdersSchedulePDFViewRow/Locations/LocName"/> и познакомьтесь с xslt/xpath и следуйте совету michael.hor257k   -  person Stefan Hegny    schedule 25.04.2017
comment
я добавил xsl выше   -  person Вячеслав Кошман    schedule 25.04.2017
comment
и какой результат вы хотите? Вы пытаетесь скопировать элемент Locations в FO?   -  person Stefan Hegny    schedule 25.04.2017
comment
@ВячеславКошман Ваш XSLT не может работать, потому что шаблоны не могут быть вложенными. Я не могу сказать вам, как это исправить, потому что вы все еще не опубликовали ожидаемый результат.   -  person michael.hor257k    schedule 25.04.2017
comment
Я помещаю шаблоны отдельно, но у меня есть javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: Document is empty (может быть, что-то не так с вашей таблицей стилей XSLT).   -  person Вячеслав Кошман    schedule 26.04.2017
comment
@Stefan Hegny, да, мне нужно распечатать элементы Locations и Items в FO   -  person Вячеслав Кошман    schedule 26.04.2017
comment
print Locations, вероятно, означает не копирование XML-элементов в fo, а их текстовое содержимое (xslt-speak: ‹xsl:value-of ...›) в правильно отформатированное fo, которое вы не показываете. Может быть, у вас есть другой вопрос о том, как работает fo?   -  person Stefan Hegny    schedule 26.04.2017


Ответы (1)


Хотя ваш ответ довольно расплывчатый, если я не ошибаюсь, вам нужен вывод:

<output>
    <ItemDesc>Content1</ItemDesc>
    <ItemDesc>Content2</ItemDesc>
    <LocName>Content3</LocName>
    <LocName>Content4</LocName>
</output>

Первый способ, который приходит на ум, — это использование рекурсивных шаблонов:

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

<xsl:template match="OrdersSchedulePDFView">
    <output>
        <xsl:apply-templates/>
    </output>
</xsl:template>

<xsl:template match="ItemDesc">
    <xsl:copy-of select="."/>
</xsl:template>

<xsl:template match="LocName">
    <xsl:copy-of select="."/>
</xsl:template>

Это повторяется по каждому узлу, и когда соответствующий шаблон найден, выполняется copy-of.

Вы упомянули в своих комментариях, что хотели бы также for-each. Это будет выглядеть примерно так:

<xsl:template match="/">
    <output>
        <xsl:for-each select="//ItemDesc">
            <xsl:copy-of select="."/>
        </xsl:for-each>
        <xsl:for-each select="//LocName">
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </output>
</xsl:template>
person D S    schedule 25.04.2017
comment
Когда я пытаюсь применить ‹xsl:template match=/› ‹output› ‹xsl:for-each select=//ItemDesc› ‹xsl:copy-of select=./› ‹/xsl:for-each› ‹xsl:for -each select=//LocName› ‹xsl:copy-of select=./› ‹/xsl:for-each› ‹/output› ‹/xsl:template› Я получаю: javax.xml.transform.TransformerException: org. apache.fop.fo.ValidationException: в fo:root отсутствуют дочерние элементы. Требуемая модель содержимого: (основной-набор макетов, объявления?, дерево закладок?, (последовательность страниц|fox:внешний-документ)+) (информация о контексте отсутствует) - person Вячеслав Кошман; 25.04.2017