xsl: если оценка с выводом nmap - PullRequest
0 голосов
/ 09 мая 2020

Для справки я использую Nmap 7.8 и пытаюсь отформатировать вывод с помощью файла xsl. Внутри xsl-файла я вызываю второй файл rules. xml для сравнения и добавления дополнительной информации. Это структура правил. xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <Item id="1">
        <info>Rule Information</info>
        <port>123</port>
        <port>321</port>
    </Item>
</root>

Когда я пытаюсь распечатать вывод порта nmap с помощью <xsl:value-of select="@portid"/>, он работает, однако, если я выполняю if или выбираю / при работе терпит неудачу. Когда я делаю stati c сравнение <xsl:if test="port = 321">, он работает с любым значением порта.

 <xsl:for-each select="ports/port">
    <xsl:choose>
        <xsl:when test="state/@state = 'open'">
            <xsl:variable name="rules" select="document('rules.xml')"/>
            <xsl:for-each select="$rules/root/Item">
                <xsl:if test="port = @portid">                                      
                    <xsl:value-of select="info"/>
                </xsl:if>
            </xsl:for-each>                              
        </xsl:when>
    </xsl:choose>
</xsl:for-each>

Желаемое поведение - l oop через все порты в выводе nmap и добавление дополнительных информационных тегов в элементе, который содержит соответствующий тег порта. Сопоставление - 1 элемент для многих портов, поэтому я хотел бы избежать правил индексации. xml с портами на верхнем уровне, чтобы предотвратить дублирование.

Ответы [ 2 ]

1 голос
/ 09 мая 2020

При использовании таких выражений, как port = @portId, вам нужно подумать о том, что является элементом контекста. Нет элемента, который имеет одновременно дочерний элемент port и атрибут portId, поэтому похоже, что две стороны этого выражения ожидают разные элементы контекста, что, конечно, не может произойти.

Обычно, когда вы выполняете соединения между несколькими документами (или внутри одного документа), вам необходимо привязать переменные к узлам, чтобы вы могли делать явный выбор, а не полагаться на неявный контекст.

1 голос
/ 09 мая 2020

Я полагаю, вы хотите сделать:

<xsl:for-each select="ports/port">
    <xsl:choose>
        <xsl:when test="state/@state = 'open'">
            <xsl:variable name="portid" select="@portid"/>
            <xsl:variable name="rules" select="document('rules.xml')"/>
            <xsl:for-each select="$rules/root/Item">
                <xsl:if test="port = $portid">                                      
                    <xsl:value-of select="info"/>
                </xsl:if>
            </xsl:for-each>                              
        </xsl:when>
    </xsl:choose>
</xsl:for-each>

или, возможно, более кратко:

<xsl:variable name="rules" select="document('rules.xml')"/>
<xsl:for-each select="ports/port[state/@state = 'open']">
    <xsl:variable name="portid" select="@portid"/>
    <xsl:for-each select="$rules/root/Item[port = $portid]">
        <xsl:value-of select="info"/>
    </xsl:for-each>   
</xsl:for-each>

То, что вы сейчас имеете, ищет Item, у которого есть ребенок port значение которого равно значению атрибута portid родительского Item.

...