3

因此,我想要做的是使用 xsltproc 查询 XML 文件,并传入服务器名称的参数。此名称包含在 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>
4

2 回答 2

1

嗯,我想通了。这是我所做的,可能不是最有效的,但它似乎有效。

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>
于 2013-03-18T03:44:51.130 回答
0

中的select属性应该使用相对于匹配的节点的路径。xsl:value-ofxsl:templatexsl:template

但你真正想要的是更改xsl:value-ofxsl:apply-templates select="Server[Name=$site_name]". 然后创建xsl:template match="Server"报告您想了解的有关服务器的内容:它的UserPass.

除了这个例子之外,如果您希望拥有数千台服务器,那么您会考虑使用xsl:key.

于 2013-03-18T02:49:00.630 回答