XSLT,xsltproc参数

时间:2013-03-18 02:45:06

标签: xml xslt

所以,我希望能够做的是使用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>

2 个答案:

答案 0 :(得分:0)

selectxsl: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>