swayamrath Ответов: 2

Xslt для внутренних узлов XML


У меня есть исходный XML-файл, и он выглядит так

<?xml version="1.0" encoding="UTF-8" ?>
<HOST_LIST_VM_DETECTION_OUTPUT>
  <RESPONSE>
    <DATETIME>2017-05-05T08:52:51Z</DATETIME>
    <HOST_LIST>
    <HOST>
        <IP>10.132.195.26</IP>
        <DETECTION_LIST>
          <DETECTION>
            <QID>38255</QID>
          </DETECTION>
          <DETECTION>
            <QID>70001</QID>
          </DETECTION>
		  </DETECTION_LIST>
		  </HOST>
	<HOST>
        <IP>172.18.4.79</IP>
        <DETECTION_LIST>
          <DETECTION>
            <QID>19626</QID>
          </DETECTION>
          <DETECTION>
            <QID>19627</QID>
          </DETECTION>
		  </DETECTION_LIST>
		  </HOST>
		      </HOST_LIST>
  </RESPONSE>
</HOST_LIST_VM_DETECTION_OUTPUT>


Я хочу, чтобы результат был поставлен вот так

<Records>
<record>
<qid>38255</qid>
<ip>10.132.195.26</ip>
</record>
<record>
<qid>70001</qid>
<ip>10.132.195.26</ip>
</record>
<record>
<qid>19626</qid>
<ip>172.18.4.79</ip>
</record>
<record>
<qid>19627</qid>
<ip>172.18.4.79</ip>
</record>
</Records>


Что я уже пробовал:

XSLT, который я пытался настроить, выглядит следующим образом

<?xml version = "1.0" encoding = "UTF-8"?> 
<xsl:stylesheet version = "1.0" 
   xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">   
   
<xsl:template match="/">
<xsl:apply-templates select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST"/>
</xsl:template>
<xsl:template match="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST">
<xsl:value-of select="IP"/>
<xsl:apply-templates select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION"/>
</xsl:temaplte>
<xsl:template match="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION">
<xsl:for-each select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION">
<xsl:value-of select="QID"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


Но я не могу попасть внутрь & lt;detection_list>

2 Ответов

Рейтинг:
2

Richard Deeming

То select запрос передан apply-templates и for-each находится относительно текущего узла.

Вы уже внутри HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST, так что ваш apply-templates запрос ищет:

HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION

и ваш for-each шаблон ищет:
HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION/HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST/DETECTION_LIST/DETECTION


Вы также должны включить элементы, которые вы хотите в свой вывод.

Измените свой шаблон на:
<?xml version = "1.0" encoding = "UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   
    <xsl:template match="/">
        <Records>
            <xsl:apply-templates select="HOST_LIST_VM_DETECTION_OUTPUT/RESPONSE/HOST_LIST/HOST"/>
        </Records>
    </xsl:template>
    
    <xsl:template match="HOST">
        <xsl:variable name="IP" select="IP" />
        <xsl:for-each select="DETECTION_LIST/DETECTION">
            <record>
                <qid><xsl:value-of select="QID"/></qid>
                <ip><xsl:value-of select="$IP"/></ip>
            </record>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>


Maciej Los

5ед!

Рейтинг:
2

Patrice T

попробуйте заменить

</xsl:temaplte>

с
</xsl:template>