从搜索参数过滤XML
问题描述:
我在创建的网站上创建小型搜索功能。我正在使用Umbraco CMS,并且我需要搜索的所有节点都是正在搜索的页面的子项。现在我有一个有七个字段的搜索框。三个输入字段和四个下拉菜单。从搜索参数过滤XML
这是我需要从找到我的结果的XML:
<Modellist id="1073" parentID="1052" level="2" writerID="0" creatorID="0" nodeType="1065" template="1066" sortOrder="0" createDate="2010-07-12T20:23:35" updateDate="2010-07-12T21:25:13" nodeName="Piger-girls" urlName="piger-girls" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073" isDoc="">
<title>Girls</title>
<metaDescription></metaDescription>
<metaTitle />
<metaKeywords />
<nameInMenu />
<Model id="1075" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="1" createDate="2010-07-12T20:25:31" updateDate="2010-07-12T21:01:58" nodeName="Lene Madsen" urlName="lene-madsen" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1075" isDoc="">
<title>Lene M</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>014</modelnummer>
<height>120</height>
<size>122</size>
<eyeColor>Blå</eyeColor>
<hairColor>Blond</hairColor>
<shoeSize>26-30</shoeSize>
</Model>
<Model id="1077" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="2" createDate="2010-07-13T19:04:42" updateDate="2010-07-13T19:05:23" nodeName="Julie B" urlName="julie-b" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1077" isDoc="">
<title>Julie B</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>002</modelnummer>
<height>129</height>
<size>104</size>
<eyeColor>Grøn</eyeColor>
<hairColor>Sort</hairColor>
<shoeSize>26-30</shoeSize>
</Model>
<Model id="1078" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="3" createDate="2010-07-13T19:05:38" updateDate="2010-07-13T19:06:06" nodeName="Marlene U" urlName="marlene-u" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1078" isDoc="">
<title>Marlene U</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>007</modelnummer>
<height>89</height>
<size>86</size>
<eyeColor>Grå</eyeColor>
<hairColor>Blond</hairColor>
<shoeSize>26-30</shoeSize>
</Model>
<Model id="1079" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="4" createDate="2010-07-13T19:06:18" updateDate="2010-07-13T19:07:20" nodeName="Louise N" urlName="louise-n" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1079" isDoc="">
<title>Louise N</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>022</modelnummer>
<height>148</height>
<size>152</size>
<eyeColor>Brun</eyeColor>
<hairColor>Brun</hairColor>
<shoeSize>31-35</shoeSize>
</Model>
<Model id="1080" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="5" createDate="2010-07-13T19:07:35" updateDate="2010-07-13T19:07:59" nodeName="Marie A" urlName="marie-a" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1080" isDoc="">
<title>Marie A</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>010</modelnummer>
<height>146</height>
<size>128</size>
<eyeColor>Blå</eyeColor>
<hairColor>Rød</hairColor>
<shoeSize>36-40</shoeSize>
</Model>
<Model id="1081" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="6" createDate="2010-07-13T19:08:22" updateDate="2010-07-13T19:08:53" nodeName="Sandra F" urlName="sandra-f" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1081" isDoc="">
<title>Sandra F</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>013</modelnummer>
<height>126</height>
<size>122</size>
<eyeColor>Blå</eyeColor>
<hairColor>Brun</hairColor>
<shoeSize>31-35</shoeSize>
</Model>
<Model id="1082" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="7" createDate="2010-07-13T19:09:10" updateDate="2010-07-13T19:09:51" nodeName="Laura N" urlName="laura-n" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1082" isDoc="">
<title>Laura N</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>004</modelnummer>
<height>73</height>
<size>74</size>
<eyeColor>Grøn</eyeColor>
<hairColor>Rød</hairColor>
<shoeSize>18-20</shoeSize>
</Model>
<Model id="1083" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="8" createDate="2010-07-13T19:10:09" updateDate="2010-07-13T19:11:19" nodeName="Gitte R" urlName="gitte-r" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1083" isDoc="">
<title>Gitte R</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>017</modelnummer>
<height>105</height>
<size>110</size>
<eyeColor>Grøn</eyeColor>
<hairColor>Brun</hairColor>
<shoeSize>21-25</shoeSize>
</Model>
<Model id="1084" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="9" createDate="2010-07-13T19:11:30" updateDate="2010-07-13T19:12:56" nodeName="Mia H" urlName="mia-h" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1084" isDoc="">
<title>Mia H</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>015</modelnummer>
<height>138</height>
<size>140</size>
<eyeColor>Blå</eyeColor>
<hairColor>Rød</hairColor>
<shoeSize>31-35</shoeSize>
</Model>
所谓的“大小”的标签,“眼睛颜色”,“hairColor的”和“shoeSize”应与匹配我的搜索框中有四个下拉菜单。称为“标题”的标签可以从称为名称的输入字段中搜索。然后我有另一个名为“heightFrom”和“heightTo”的文本框。这里用户可以在高度上进行搜索,并且这应该与称为“高度”的XML标签匹配。
很容易的,我说,如果名称字段不为空,我可以只是这样做:
<xsl:apply-templates select="$currentPage/*[@isDoc][contains(Exslt.ExsltStrings:lowercase(./title),$name)]">
<xsl:sort data-type="text" select="title" order="ascending"/>
</xsl:apply-templates>
$名称中包含搜索姓名。这将给我所有在“标题” - 标签中具有搜索名称的节点。但是,我怎么从这里开始。当然,我可以创造一个选择,有很多(超过40个)时间,但这对于这个很重要,而且在将来很难保持。 其中一个难点是没有任何字段是强制性的,所以我不知道哪个字段会被填写。 我可以做其他事吗?
顺便说一句 - 一个URL可能例子是这样的: http://my.site/search.aspx?hf=150&ht=&size=62&ec=&hc=&ss=&name=Julie
我所有的值的七个变量是这样的:
<xsl:variable name="heightFrom" select="umbraco.library:Request('hf')"/>
<xsl:variable name="heightTo" select="umbraco.library:Request('ht')"/>
<xsl:variable name="size" select="umbraco.library:Request('size')"/>
<xsl:variable name="eyeColor" select="umbraco.library:Request('ec')"/>
<xsl:variable name="shoeSize" select="umbraco.library:Request('ss')"/>
<xsl:variable name="hairColor" select="umbraco.library:Request('hc')"/>
<xsl:variable name="name" select="Exslt.ExsltStrings:lowercase(umbraco.library:Request('name'))"/>
任何帮助和投入将大大appreaciated !
感谢提前:)
/金
答
我想你只需要在正确的上下文中的XPath表达式。这styleshet:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:param name="heightFrom" select="120"/>
<xsl:param name="heightTo" select="130"/>
<xsl:param name="size" />
<xsl:param name="eyeColor" />
<xsl:param name="shoeSize" />
<xsl:param name="hairColor" />
<xsl:param name="name" />
<xsl:template match="/">
<Modellist>
<xsl:copy-of select="*/Model[height >= $heightFrom and $heightTo >= height
or
height >= $heightFrom and not($heightTo)
or
not($heightFrom) and $heightTo >= height]
[size = $size or not($size)]
[eyeColor = $eyeColor or not($eyeColor)]
[$shoeSize >= substring-before(shoeSize,'-')
and
substring-after(shoeSize,'-') >= $shoeSize
or
not($shoeSize)]
[hairColor = $hairColor or not($hairColor)]
[title = $name or not($name)]"/>
</Modellist>
</xsl:template>
</xsl:stylesheet>
结果:
<Modellist>
<Model id="1075" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="1" createDate="2010-07-12T20:25:31" updateDate="2010-07-12T21:01:58" nodeName="Lene Madsen" urlName="lene-madsen" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1075" isDoc="">
<title>Lene M</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>014</modelnummer>
<height>120</height>
<size>122</size>
<eyeColor>Blå</eyeColor>
<hairColor>Blond</hairColor>
<shoeSize>26-30</shoeSize>
</Model>
<Model id="1077" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="2" createDate="2010-07-13T19:04:42" updateDate="2010-07-13T19:05:23" nodeName="Julie B" urlName="julie-b" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1077" isDoc="">
<title>Julie B</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>002</modelnummer>
<height>129</height>
<size>104</size>
<eyeColor>Grøn</eyeColor>
<hairColor>Sort</hairColor>
<shoeSize>26-30</shoeSize>
</Model>
<Model id="1081" parentID="1073" level="3" writerID="0" creatorID="0" nodeType="1067" template="1068" sortOrder="6" createDate="2010-07-13T19:08:22" updateDate="2010-07-13T19:08:53" nodeName="Sandra F" urlName="sandra-f" writerName="Administrator" creatorName="Administrator" path="-1,1052,1073,1081" isDoc="">
<title>Sandra F</title>
<images></images>
<polaroid />
<videoSmall />
<videoLarge />
<modelnummer>013</modelnummer>
<height>126</height>
<size>122</size>
<eyeColor>Blå</eyeColor>
<hairColor>Brun</hairColor>
<shoeSize>31-35</shoeSize>
</Model>
</Modellist>
你能说我通情达理的你,如果我说你想匹配的变量条件的'Model'元素? – 2010-07-13 23:23:34
是的,这是正确的。也许我没有这么好描述。但你是对的。我想要符合搜索标准的模型元素。如果你有提示或提示,只是这样说,它可能会导致我的方向正确:) - 谢谢。 – 2010-07-14 07:03:30