所以,我希望能够做的是使用xsltproc查询XML文件,传入服务器的NAME参数。该名称包含在XML文档中。我想从这个文件中提取用户名和密码。
因此,Name是User和Pass的兄弟。我不经常使用XSLT或XPath或XQuery(这是19年来的第二次)。我只是迷失了如何从样式表中提取XML文件中的数据。
这是我从CLI传入的内容(我认为是对的):
xsltproc --stringparam site_name "'site2'" style.xsl source.xml
这是XML
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Container>
<Servers>
<Folder expanded="1">
<Server>
<User>username1</User>
<Pass>password1</Pass>
<Name>Site1</Name>
</Server>
<Server>
<User>username2</User>
<Pass>password2</Pass>
<Name>Site2</Name>
</Server>
</Folder>
<Server>
<User>username3</User>
<Pass>password3</Pass>
<Name>Site3</Name>
</Server>
<Server>
<User>username4</User>
<Pass>password4</Pass>
<Name>Site4</Name>
</Server>
</Servers>
</Container>
这是我当前的XSLT样式表
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="site_name">Site1</xsl:param>
<xsl:output method="text"/>
<xsl:template match="//Servers">
<xsl:value-of select="//Server/Name"/>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:0)
select
中xsl:value-of
的{{1}}属性应使用相对于与xsl:template
匹配的节点的路径。
但您真正想要的是将xsl:template
更改为xsl:value-of
。然后创建xsl:apply-templates select="Server[Name=$site_name]"
,报告您想要了解的有关服务器的内容:xsl:template match="Server"
和User
。
除了这个例子,如果您希望拥有数千台服务器,那么您将考虑使用Pass
。
答案 1 :(得分:0)
好吧,我明白了。这就是我所做的,可能不是最有效的,但似乎有效。
CLI的使用情况几乎相同,我拿出了单引号
xsltproc --stringparam site_name "site2" style.xsl source.xml
<强>样式表强>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="site_name">Site1</xsl:param>
<xsl:output method="text"/>
<xsl:template match="Servers">
<xsl:for-each select="//Server">
<xsl:if test="Name=$site_name">
<xsl:value-of select="User"/>
<xsl:value-of select="Pass"/>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>