Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XSLT-使用配置节点按子节点筛选父节点时遇到的问题_Xml_Xslt_Key - Fatal编程技术网

Xml XSLT-使用配置节点按子节点筛选父节点时遇到的问题

Xml XSLT-使用配置节点按子节点筛选父节点时遇到的问题,xml,xslt,key,Xml,Xslt,Key,我在XSL中遇到了一些无法解决的问题 我有下面的xml,我只想显示至少有一个项由config/enable items节点启用的主节点 有什么提示吗 提前谢谢 xml: p、 s: 我尝试过使用key,为id属性索引的enable项定义一个key,并对每个项执行一个for,以定义一个变量。。。 但是没有运气,:(,我仍然不知道在显示main@name属性之前如何检查main中的项目…好吧 我在现实世界的应用程序上尝试使用更复杂的xml。 当我在这里发布这个示例时,我设法让它工作:) 按照下面的答

我在XSL中遇到了一些无法解决的问题

我有下面的xml,我只想显示至少有一个项由config/enable items节点启用的主节点

有什么提示吗

提前谢谢

xml:

p、 s: 我尝试过使用key,为id属性索引的enable项定义一个key,并对每个项执行一个for,以定义一个变量。。。 但是没有运气,:(,我仍然不知道在显示main@name属性之前如何检查main中的项目…

好吧

我在现实世界的应用程序上尝试使用更复杂的xml。 当我在这里发布这个示例时,我设法让它工作:)

按照下面的答案:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:key name="enable-items" match="config/enable-items/item" use="@id"/>
<xsl:template match="/xml">
<xsl:apply-templates select="main" />  
</xsl:template>

<xsl:template match="main">
    <xsl:if test="key('enable-items', item/@id)">

        <h1><xsl:value-of select="@name"/> </h1>

                <xsl:for-each select="key('enable-items', item/@id)">
               <xsl:value-of select="@id" /> <br>

             </xsl:for-each>
    </xsl:if>
</xsl:template>

</xsl:stylesheet>


以下内容:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                exclude-result-prefixes="xs"
                version="2.0">

   <xsl:output method="text"/>

   <xsl:template match="/input">
      <xsl:variable name="keys" select="config/enable-items/item/@id" as="xs:string+"/>
      <xsl:variable name="items" select="main/item[@id = $keys]"/>
      <xsl:for-each select="$items/..">
         <xsl:variable name="main" select="."/>
         <xsl:value-of select="@name"/>
         <xsl:text>:&#10;</xsl:text>
         <xsl:for-each select="$items intersect $main/item">
            <xsl:text>    * </xsl:text>
            <xsl:value-of select="@id"/>
            <xsl:text>&#10;</xsl:text>
         </xsl:for-each>
      </xsl:for-each>
   </xsl:template>

</xsl:stylesheet>
Main Section 1:
    * a
Main Section 2:
    * e
如果将第二个配置项更改为
e
,则会产生以下结果:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                exclude-result-prefixes="xs"
                version="2.0">

   <xsl:output method="text"/>

   <xsl:template match="/input">
      <xsl:variable name="keys" select="config/enable-items/item/@id" as="xs:string+"/>
      <xsl:variable name="items" select="main/item[@id = $keys]"/>
      <xsl:for-each select="$items/..">
         <xsl:variable name="main" select="."/>
         <xsl:value-of select="@name"/>
         <xsl:text>:&#10;</xsl:text>
         <xsl:for-each select="$items intersect $main/item">
            <xsl:text>    * </xsl:text>
            <xsl:value-of select="@id"/>
            <xsl:text>&#10;</xsl:text>
         </xsl:for-each>
      </xsl:for-each>
   </xsl:template>

</xsl:stylesheet>
Main Section 1:
    * a
Main Section 2:
    * e

这是一个非常理想的解决方案。感谢你自己发现并分享解决方案。很好!我不知道我可以使用这样的变量。谢谢
Main Section 1:
    * a
Main Section 2:
    * e