Даже есть почти тот же вопрос, я не получаю результат не для меня.
Идея может быть простой, но я не очень хорошо понимаю все фоновые процессы, чтобы решить эту проблему.
Я получил несколько шаблонов с одинаковым соответствием, показывающим разные результаты.
Извлечение набора данных из следующего узла может выглядеть так:
<LAYERS>
<LAYER DEPTHTO = "93.63" PETRO = "Sand" STRAT = "geologiscal_formation_1" INTV = "1"/>
<LAYER DEPTHTO = "94.00" PETRO = "Sand" STRAT = "geologiscal_formation_1" INTV = "1"/>
<LAYER DEPTHTO = "95.00" PETRO = "Gravel" STRAT = "geologiscal_formation_1" INTV = "1"/>
<LAYER DEPTHTO = "100.00" PETRO = "Sand" STRAT = "geologiscal_formation_1" INTV = "1"/>
<LAYER DEPTHTO = "100.50" PETRO = "Mud" STRAT = "geologiscal_formation_1" INTV = "1"/>
</LAYERS>
и я пытаюсь получить текстовый вывод, используя несколько шаблонов.
Желаемый результат должен выглядеть так, используя 3 шаблона:
Depth_to: 93.63
Depth_to: 94.00
Depth_to: 95.00
Depth_to: 100.00
Depth_to: 100.50
Petro:: Sand
Petro:: Sand
Petro:: Gravel
Petro:: Sand
Petro:: Mud
Strat: geologiscal_formation_1
Strat: geologiscal_formation_1
Strat: geologiscal_formation_1
Strat: geologiscal_formation_1
Strat: geologiscal_formation_1
И моя идея в kinda-pseudo-xslt выглядит так, пытаясь собрать все шаблоны в верхней части (закомментировать), имея шаблоны в блоках в нижней части:
<?xml version = "1.0" encoding = "utf-8"?>
<xsl:stylesheet version = "1.0"
xmlns:xml = "http://www.w3.org/XML/1998/namespace"
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes = " xml xsl xs">
<xsl:output method = "text" version = "1.0" indent = "yes" />
<!--
<xsl:template name = "all_data" >
<xsl:use-template name = "path" />
<xsl:use-template name = "petro" />
<xsl:use-template name = "strat" />
</xsl:template>
-->
<xsl:template name = "path" match = "/" >
<xsl:for-each select = "LAYERS/LAYER">
<xsl:text>Depth_to: </xsl:text>
<xsl:value-of select = "@DEPTHTO"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template name = "petro" match = "/" >
<xsl:for-each select = "LAYERS/LAYER">
<xsl:text>Petro:: </xsl:text>
<xsl:value-of select = "@PETRO"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
<xsl:template name = "strat" match = "/" >
<xsl:for-each select = "LAYERS/LAYER">
<xsl:text>Strat: </xsl:text>
<xsl:value-of select = "@STRAT"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Но это дает мне только результат одного шаблона:
Strat: geologiscal_formation_1
Strat: geologiscal_formation_1
Strat: geologiscal_formation_1
Strat: geologiscal_formation_1
Strat: geologiscal_formation_1
Я уверен, что есть и другие способы добиться результата, но ключевой вопрос заключается в том, как управлять несколькими шаблонами для такого результата?
Заранее спасибо за любую помощь :)
Это сделает то, что вы хотите.
<xsl:template match = "LAYERS">
<xsl:apply-templates select = "LAYER/@DEPTHTO"/>
<xsl:apply-templates select = "LAYER/@PETRO"/>
<xsl:apply-templates select = "LAYER/@STRAT"/>
</xsl:template>
<xsl:template match = "@DEPTHTO">
<xsl:text>Depth_to: </xsl:text>
<xsl:value-of select = "."/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match = "@PETRO">
<xsl:text>Petro:: </xsl:text>
<xsl:value-of select = "."/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match = "@STRAT">
<xsl:text>Strat: </xsl:text>
<xsl:value-of select = "."/>
<xsl:text>
</xsl:text>
</xsl:template>
Вы могли бы объединить три шаблона в один с параметром. Однако я сомневаюсь, что OP может использовать любую версию, потому что реальная проблема IIUC больше, чем в данном примере.
Это все правда. Я не пошел по пути параметра, так как думал, что это будет легче понять и изменить в случае, если один атрибут должен отличаться от других. Но использование параметра становится даже лучшим вариантом, если вводится больше атрибутов.
Если вы хотите вызвать несколько шаблонов для одного и того же узла, используйте режимы:
<xsl:template match = "/" mode = "Depth">
...
</xsl:template>
<xsl:template match = "/" mode = "Petro">
...
</xsl:template>
<xsl:template match = "/" mode = "Strat">
...
</xsl:template>
...
<xsl:apply-templates select = "." mode = "Depth"/>
<xsl:apply-templates select = "." mode = "Petro"/>
<xsl:apply-templates select = "." mode = "Strat"/>
Для вашего конкретного примера это кажется чрезмерно сложным, но, возможно, ваша реальная задача сложнее.
Привет, Майкл, твой ответ, похоже, помог (режимы). Единственное, что мне нужно было сделать, это поместить «apply-templates» в сам шаблон, потому что я не могу поместить их непосредственно в таблицу стилей. Кроме того, это работает. Большое спасибо :)
Да, «...» должно было означать, что мой код не должен быть полным.
Почему бы вам просто не объединить все 3
xsl:for each
инструкции в один шаблон? Или, если хотите, удалите атрибутыmatch
и назовите их по имени из одного шаблона.