【问题标题】:XPath for nodes where a subnode has attribute AND contains text子节点具有属性且包含文本的节点的 XPath
【发布时间】:2013-01-22 10:07:31
【问题描述】:

看不到完成这个,理论上比较简单的任务:

查找节点文档,其中字段具有包含特定文本的属性名称和子节点选项具有值的位置。

XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
...
    <Documents>
    <Document Id="35330">
        <Name>The Name 1</Name>
        <DocumentEdition>
            <Fields>            
                <Field Name="Børn-Andet Godt" FieldType="CheckBoxGroup">
                    <Option Name="Billedkunst"></Option>           
                </Field>
                <Field Name="Børn-Fritidsklub" FieldType="CheckBoxGroup">
                    <Option Name="Fritidshjem"></Option>
                    <Option Name="Fritidsklub"></Option>
                    <Option Name="Ungdomsklubber"></Option>
                </Field>
                <Field Name="Børn-Fritidsliv" FieldType="CheckBoxGroup">
                    <Option Name="Natur- og fritidsforeninger"></Option>
                    <Option Name="Rollespil"></Option>
                    <Option Name="Spejder">B-Spejder</Option>
                </Field>
            </Fields>
        </DocumentEdition>
    </Document>
        <Document Id="35332">
            <Name>The Name 2</Name>
            <DocumentEdition>
                <Fields>
                    <Field Name="Børn-Andet Godt" FieldType="CheckBoxGroup">
                        <Option Name="Billedkunst"></Option>
                    </Field>
                    <Field Name="Børn-Fritidsklub" FieldType="CheckBoxGroup">
                        <Option Name="Fritidshjem">Fritidshjem</Option>
                        <Option Name="Fritidsklub"></Option>
                        <Option Name="Ungdomsklubber"></Option>
                    </Field>
                    <Field Name="Børn-Fritidsliv" FieldType="CheckBoxGroup">
                        <Option Name="Natur- og fritidsforeninger"></Option>
                        <Option Name="Rollespil"></Option>
                        <Option Name="Spejder"></Option>
                    </Field>
                </Fields>
            </DocumentEdition>
        </Document>
    </Documents>
..
</root>

所以我希望能够将模板应用于类似的文档

  <xsl:apply-templates select="//Document[/DocumentEdition/Fields/Field[contains(@Name,'Børn-Fritid')]/Option/text()&gt;'']"/>

但那行不通。

只是为了指定:文档必须在选项中包含文本,该选项是 @Name 包含特定文本的字段的子节点。

在 xml 中,使用输入值:

1 : Børn-Fritidsliv => 选择第一个文档

2 : Børn-Fritidsklub => 选择第二个文档

3 : Børn-Fritid => 选择两个文档

请指点我正确的方向。

【问题讨论】:

    标签: xml xslt xpath xslt-1.0


    【解决方案1】:

    删除谓词中的前导斜杠并检查是否存在带有内容的Option,即更改

    <xsl:apply-templates 
     select="//Document[/DocumentEdition/Fields/Field[contains(@Name,'Børn-Fritid')]/Option/text()&gt;'']"/>
    

    <xsl:apply-templates 
     select="//Document[DocumentEdition/Fields/Field[contains(@Name,'Børn-Fritid') and Option[normalize-space()]]]"/>
    

    【讨论】:

    • 对不起,缺少括号,我将编辑并更正示例。