XSLT 文档()不调用特定节点
XSLT document() not calling specific nodes
我试图在我的 xsl 代码中调用 'firstName' 节点,但是当我尝试调用 'value-of select="firstName' 时,它似乎不起作用,并且一旦转换,它就不会显示任何内容为此。
我的 xsl 代码是:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="customers" select="document('customer.xml')/customers"/>
<xsl:template match="/">
<xsl:copy>
<xsl:for-each select="transactions/transaction">
<xsl:sort select="giftShop"/>
<xsl:sort select="transaction_date"/>
Shop: <xsl:value-of select="giftShop"/>
Date: <xsl:value-of select="transaction_date"/>
<xsl:for-each select="$customers">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
transactions.xml(第一个 xml 文件):
<?xml version="1.0"?>
<transactions>
<transaction>
<transaction_date>01/11/2019</transaction_date>
<customerID>8BLOJZWL</customerID>
<giftShop>1</giftShop>
<transactionID>BjYAtd7lmEOlQUVy</transactionID>
<value currency="gbp">149.99</value>
</transaction>
<transaction>
<transaction_date>01/11/2019</transaction_date>
<customerID>DR18OCFI</customerID>
<giftShop>2</giftShop>
<transactionID>aQ27lMvfnlzY4mkx</transactionID>
<value currency="gbp">100.11</value>
</transaction>
<transaction>
customer.xml(第二个 xml 文件):
<?xml version="1.0"?>
<customers>
<customer>
<prefix>Mrs</prefix>
<lastName>Samantha</lastName>
<givenName>Smith</givenName>
<addressID>213456</addressID>
<customerID>ASJ4OTLG</customerID>
</customer>
<customer>
<prefix>Mr </prefix>
<lastName>Cameron</lastName>
<givenName>Wills</givenName>
<addressID>125907</addressID>
<customerID>SID8RY23</customerID>
</customer>
</customers>
预期输出:
如果我的预期输出不是很准确,我也很抱歉,我是 xml 和 xsl
的新手
<giftShop>
<transaction_date>
<transacation>
<customer>
我正在尝试调用特定的 'customer data',但目前它显示了所有数据,并且在我尝试关闭文件时一直使我的 Notepad++ 崩溃。
非常感谢任何帮助!!
因为您的文档变量已经引用了 "customers"
<xsl:variable name="customers" select="document('customer.xml')/customers"/>
当你执行 for 循环时
<xsl:for-each select="$customers">
<xsl:value-of select="."/>
</xsl:for-each>
你应该这样做
<xsl:for-each select="$customers/customer">
<xsl:value-of select="customerID"/> <!-- Or whichever node you want -->
</xsl:for-each>
我猜 (!) 你想做这样的事情:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="customers" select="document('retail_customer.xml')/customers"/>
<xsl:template match="/transactions">
<xsl:for-each select="transaction">
<xsl:sort select="giftShop"/>
<xsl:sort select="transaction_date"/>
<xsl:text>Shop: </xsl:text>
<xsl:value-of select="giftShop"/>
<xsl:text> Date: </xsl:text>
<xsl:value-of select="transaction_date"/>
<xsl:variable name="customer" select="$customers/customer[customerID=current()/customerID]"/>
<xsl:text> Customer: </xsl:text>
<xsl:value-of select="$customer/lastName"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$customer/givenName"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当然,这只有在交易在其他文档中有匹配的客户时才有效。在您的示例中,有 none.
P.S. 请注意,<xsl:sort select="transaction_date"/>
在您的情况下无法正常工作,因为您的日期在 DD/MM/YYYY
( 或 MM/DD/YYYY
?) 格式,并且按字母顺序对它们进行排序不会产生时间顺序。但这是一个单独的问题(您可以在这里找到答案:)。
我试图在我的 xsl 代码中调用 'firstName' 节点,但是当我尝试调用 'value-of select="firstName' 时,它似乎不起作用,并且一旦转换,它就不会显示任何内容为此。
我的 xsl 代码是:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="customers" select="document('customer.xml')/customers"/>
<xsl:template match="/">
<xsl:copy>
<xsl:for-each select="transactions/transaction">
<xsl:sort select="giftShop"/>
<xsl:sort select="transaction_date"/>
Shop: <xsl:value-of select="giftShop"/>
Date: <xsl:value-of select="transaction_date"/>
<xsl:for-each select="$customers">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
transactions.xml(第一个 xml 文件):
<?xml version="1.0"?>
<transactions>
<transaction>
<transaction_date>01/11/2019</transaction_date>
<customerID>8BLOJZWL</customerID>
<giftShop>1</giftShop>
<transactionID>BjYAtd7lmEOlQUVy</transactionID>
<value currency="gbp">149.99</value>
</transaction>
<transaction>
<transaction_date>01/11/2019</transaction_date>
<customerID>DR18OCFI</customerID>
<giftShop>2</giftShop>
<transactionID>aQ27lMvfnlzY4mkx</transactionID>
<value currency="gbp">100.11</value>
</transaction>
<transaction>
customer.xml(第二个 xml 文件):
<?xml version="1.0"?>
<customers>
<customer>
<prefix>Mrs</prefix>
<lastName>Samantha</lastName>
<givenName>Smith</givenName>
<addressID>213456</addressID>
<customerID>ASJ4OTLG</customerID>
</customer>
<customer>
<prefix>Mr </prefix>
<lastName>Cameron</lastName>
<givenName>Wills</givenName>
<addressID>125907</addressID>
<customerID>SID8RY23</customerID>
</customer>
</customers>
预期输出: 如果我的预期输出不是很准确,我也很抱歉,我是 xml 和 xsl
的新手<giftShop>
<transaction_date>
<transacation>
<customer>
我正在尝试调用特定的 'customer data',但目前它显示了所有数据,并且在我尝试关闭文件时一直使我的 Notepad++ 崩溃。
非常感谢任何帮助!!
因为您的文档变量已经引用了 "customers"
<xsl:variable name="customers" select="document('customer.xml')/customers"/>
当你执行 for 循环时
<xsl:for-each select="$customers">
<xsl:value-of select="."/>
</xsl:for-each>
你应该这样做
<xsl:for-each select="$customers/customer">
<xsl:value-of select="customerID"/> <!-- Or whichever node you want -->
</xsl:for-each>
我猜 (!) 你想做这样的事情:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:variable name="customers" select="document('retail_customer.xml')/customers"/>
<xsl:template match="/transactions">
<xsl:for-each select="transaction">
<xsl:sort select="giftShop"/>
<xsl:sort select="transaction_date"/>
<xsl:text>Shop: </xsl:text>
<xsl:value-of select="giftShop"/>
<xsl:text> Date: </xsl:text>
<xsl:value-of select="transaction_date"/>
<xsl:variable name="customer" select="$customers/customer[customerID=current()/customerID]"/>
<xsl:text> Customer: </xsl:text>
<xsl:value-of select="$customer/lastName"/>
<xsl:text> </xsl:text>
<xsl:value-of select="$customer/givenName"/>
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
当然,这只有在交易在其他文档中有匹配的客户时才有效。在您的示例中,有 none.
P.S. 请注意,<xsl:sort select="transaction_date"/>
在您的情况下无法正常工作,因为您的日期在 DD/MM/YYYY
( 或 MM/DD/YYYY
?) 格式,并且按字母顺序对它们进行排序不会产生时间顺序。但这是一个单独的问题(您可以在这里找到答案: