2013-10-08 3 views
0

Это основано на одних и тех же исходных данных, что и в этом вопросе: Use XSLT/XPATH to select elements having a child element with a specific valueВыберите узлы XML на основе двух различных атрибутов

Однако мне нужно теперь выбрать только <file> элементы, где:

  1. по меньшей мере, один <shared_element> начинается "$/Beta"
  2. <user> является "Джон"

.2. это единственное дополнение к предыдущему вопросу ... Я попытался добавить дополнительный тест, но мой XSLT слишком плохо, чтобы понять, как это сделать. В идеале я хочу знать, как изменить XSL в принятом ответе, но общий пример «как требовать значения по отдельным элементам/атрибутам» - это просто отлично.

ответ

1

Вам просто нужно изменить предикат XPath в инструкции select внутри шаблона, который соответствует root. Вот модифицированная версия XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 

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

    <xsl:template match="root"> 
    <xsl:copy> 
     <xsl:apply-templates select="file[shared_links[shared_link[starts-with(., '$/Beta')]] and user='John']"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="file"> 
    <xsl:copy> 
     <xsl:apply-templates select="name | vss_path | shared_links | user"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="shared_links"> 
    <xsl:copy> 
     <xsl:apply-templates select="shared_link[starts-with(., '$/Beta')]"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

При нанесении на следующий входной XML (добавлен дополнительный тест):

<root> 
    <file> 
    <name>file.bat</name> 
    <version>111</version> 
    <checkedout>No</checkedout> 
    <binary>Text</binary> 
    <vss_path>$/Code/file.bat</vss_path> 
    <original_path>C:\code\file.bat</original_path> 
    <action>Labeled &apos;1.2.3.4&apos;</action> 
    <date>27/09/2013 09:08:00</date> 
    <comment></comment> 
    <label>1.2.3.4</label> 
    <label_comment></label_comment> 
    <user>John</user> 
    <shared_links> 
     <shared_link>$/Alpha_1</shared_link> 
     <shared_link>$/Branches/New_Feature</shared_link> 
    </shared_links> 
    </file> 
    <file> 
    <name>file.bat</name> 
    <version>111</version> 
    <checkedout>No</checkedout> 
    <binary>Text</binary> 
    <vss_path>$/Code/file.bat</vss_path> 
    <original_path>C:\code\file.bat</original_path> 
    <action>Labeled &apos;1.2.3.4&apos;</action> 
    <date>27/09/2013 09:08:00</date> 
    <comment></comment> 
    <label>1.2.3.4</label> 
    <label_comment></label_comment> 
    <user>John</user> 
    <shared_links> 
     <shared_link>$/Beta_1</shared_link> 
     <shared_link>$/Branches/New_Feature</shared_link> 
    </shared_links> 
    </file> 
    <file> 
    <name>file.bat</name> 
    <version>111</version> 
    <checkedout>No</checkedout> 
    <binary>Text</binary> 
    <vss_path>$/Code/file.bat</vss_path> 
    <original_path>C:\code\file.bat</original_path> 
    <action>Labeled &apos;1.2.3.4&apos;</action> 
    <date>27/09/2013 09:08:00</date> 
    <comment></comment> 
    <label>1.2.3.4</label> 
    <label_comment></label_comment> 
    <user>Ben</user> 
    <shared_links> 
     <shared_link>$/Beta_1</shared_link> 
     <shared_link>$/Branches/New_Feature</shared_link> 
    </shared_links> 
    </file> 
</root> 

производит следующий вывод:

<root> 
    <file> 
     <name>file.bat</name> 
     <vss_path>$/Code/file.bat</vss_path> 
     <user>John</user> 
     <shared_links> 
     <shared_link>$/Beta_1</shared_link> 
     </shared_links> 
    </file> 
</root> 
Смежные вопросы