Поскольку у вас есть данные XML, почему бы не использовать таблицу стилей XSLT ?. Этот пример выбирает значение желаемых атрибутов. В этом примере используются только функции XPath 1.0, которые несколько ограничены. Он выводит значения желаемых атрибутов href.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="text" indent="no"/>
<xsl:template match="*[@href]">
<xsl:if test="contains(@href, 'RELATION_ID')">
<xsl:value-of select="@href"/>
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
Учитывая, что вы назвали "example.xml" заданным файлом и "example-xslt.xsl" при условии таблицы стилей XSLT, вы можете использовать следующую строку для сохранения результата в файл "out.txt", используя MSXSL. ехе
C:\Documents and Settings\fer\Escritorio>msxsl.exe -xw example.xml example-xslt.xsl > out.txt
Редактировать: Далее идет XSLT с использованием XPath v2.0, который позволяет использовать мощь регулярных выражений внутри функций обработки строк. Результатом является идентификатор внутри URL, который вы искали (вместо целого значения атрибутов href).
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fn="http://www.w3.org/2005/xpath-functions" >
<xsl:output method="text" indent="no"/>
<xsl:template match="*[@href]">
<xsl:if test="fn:contains(@href, 'RELATION_ID')">
<xsl:value-of select="fn:replace(@href,'.*/([^/]*)\?.*', '$1')"/>
<xsl:text>
</xsl:text>
</xsl:if>
<xsl:apply-templates select="*"/>
</xsl:template>
<xsl:template match="*">
<xsl:apply-templates select="*"/>
</xsl:template>
</xsl:stylesheet>
Существует не так много бесплатных процессоров XSLT v2.0, но AltovaXML-2008 - один из них. Следующая командная строка дает ожидаемый результат.
C:\Documents and Settings\fer\Escritorio>AltovaXML -xslt2 example-xslt.xsl -in example.xml