Переименуйте узлы с XSLT

Вместо этого вы можете использовать Collectors.toMap в качестве downstream:

Map<Resource, Map<String, Object>> result = pResolved
        .stream()
        .collect(groupingBy(Function.identity(),
                flatMapping(resource -> resource.getCapabilities().stream(),
                        flatMapping(cap -> cap.getAttributes().entrySet().stream(),
                                toMap(Map.Entry::getKey, Map.Entry::getValue)))));
6
задан Pittsburgh DBA 8 November 2008 в 15:21
поделиться

2 ответа

Почему XSLT мог бы перестать работать?

XSLT перестанет работать из-за очевидных вещей как опечатки. Однако наиболее вероятная ситуация касается использования пространства имен. Если Вы объявили пространство имен по умолчанию для своего XML, но не включайте это в свой XSLT, XSLT не будет соответствовать шаблонам, как Вы могли бы ожидать.

Следующий пример добавляет xmlns:business атрибут, который объявляет что объекты, квалифицированные business префикс принадлежит пространству имен mynamespace.uri. Я затем использовал этот префикс для квалификации соответствий шаблона Address и Addresses. Конечно, необходимо будет изменить пространство имен URI на любые соответствия пространство имен по умолчанию XML-файла.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:business="mynamespace.uri"
                exclude-result-prefixes="msxsl">
  <xsl:template match="/">
    <xsl:apply-templates select="@*|node()"/>
  </xsl:template>

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

  <xsl:template match="business:Addresses">
    <xsl:element name="BusinessAddresses">
      <xsl:apply-templates select="@*|node()" />
    </xsl:element>
  </xsl:template>

  <xsl:template match="business:Address">
    <xsl:element name="BusinessAddress">
      <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>

Как Вы соответствуете шаблонам на основе местоположения элемента, а также имени?

Существует несколько способов достигнуть этой последней части к Вашей проблеме, BusinessAddress или ContactAddress, но самое легкое должно изменить шаблон match атрибуты для рассмотрения родительских узлов. Если Вы думаете match припишите как путь к XML для узла, эта опция становится более ясной (содержание шаблонов, не учтенных для краткости):

<xsl:template match="business:Business/business:Addresses>
</xsl:template>

<xsl:template match="business:Business/business:Addresses/business:Address">
</xsl:template>

<xsl:template match="business:Contact/business:Addresses">
</xsl:template>

<xsl:template match="business:Contact/business:Addresses/business:Address">
</xsl:template>

Другие методы существуют для достижения этого если match остается на основе просто имени элемента, но их более трудно реализовать, следовать, и поддержать, поскольку они включают использование условного выражения, проверяет родительскую иерархию узла элемента, являющегося обрабатывающим, все в шаблоне.

10
ответ дан 10 December 2019 в 00:46
поделиться

Возможно, это, если данные Вы показываете, действительно похоже на то, с чем Вы взялись за работу

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

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

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

<xsl:template match="Addresses">
 <BusinessAddresses>
  <xsl:apply-templates/>
 </BusinessAddresses>
</xsl:template>

<xsl:template match="Addresses/Address">
 <BusinessAddress>
  <xsl:value-of select="."/>
 </BusinessAddress>
</xsl:template>

</xsl:stylesheet>      
0
ответ дан 10 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

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