2009-02-25 26 views
90

Trong XSLT có làCó phần tử tên XSLT không?

<xsl:value-of select="expression"/> 

để nhận được giá trị của một phần tử, nhưng là có một cái gì đó để chọn thẻ tên của nguyên tố này?

Trong một tình huống như thế này:

<person> 
    <!-- required stuff --> 
    <name>Robert</name> 
    <!-- optional stuff, free form for future extension. 
     Using XMLSchema's xsd:any --> 
    <profession>programmer</profession> 
    <hobby>photography</hobby> 
</person> 

<xsl:for-each select="person"> 
    <xsl:tag-of select="."/> : <xsl:value-of select="."/> 
</xsl:for-each> 

Để có được kết quả như thế này:

name : Robert 
profession : programmer 
hobby : photography 

Tất nhiên XSLT trên sẽ không biên dịch vì

<xsl:tag-of select="expression"/> 

không tồn tại. Nhưng làm thế nào điều này có thể được thực hiện?

+0

Thẻ phù hợp nhất cho câu hỏi này là XPath. Cả hai hàm đều là các hàm chuẩn XPath và có thể được sử dụng trong biểu thức XPath trong ngữ cảnh của bất kỳ ngôn ngữ lưu trữ nào (C#, XSLT, XQuery, ...) Vui lòng nhập lại –

+0

Văn bản này: "Trong XSLT có < xsd: value-of select = "expression" /> "- chứa lỗi. Tiền tố thường được sử dụng cho các lệnh XSLT là "xsl". Thông thường, khi sử dụng Lược đồ XML, chúng tôi sử dụng tiền tố "xsd" hoặc "xs". Xin vui lòng, chính xác. –

+0

Cảm ơn, những nhu cầu sửa chữa. –

Trả lời

139

này sẽ cung cấp cho bạn tên phần tử hiện tại (tên thẻ)

<xsl:value-of select ="name(.)"/> 

OP-Chỉnh sửa: Điều này cũng sẽ làm các trick:

<xsl:value-of select ="local-name()"/> 
+11

tên địa phương là những gì bạn muốn 9 lần trong số 10 – annakata

+16

tên địa phương là không gian tên sans, đây là lý do tại sao nó thường tốt hơn. –

6
<xsl:value-of select="name(.)" /> : <xsl:value-of select="."/> 
+0

Vậy tại sao điều này lại bị bỏ phiếu? Cấp có thể đã đề cập tên địa phương() nếu bạn không muốn không gian tên là tốt, nhưng nó sẽ hữu ích cho cộng đồng rộng lớn hơn để giải thích tại sao điều này sẽ không hoạt động. –

+0

Có lẽ, nó không thể chuyển đổi XML đã cho. tên (.) sẽ là "người" trong trường hợp này. nó phải là "tên", "nghề nghiệp" và "sở thích". –

+0

@CodeMelt Tại sao bạn không downvote câu trả lời được chấp nhận? Nó tốt, nhưng thậm chí còn ít cụ thể hơn cái này. Tôi đã bỏ phiếu cho câu trả lời của Rowland Shaw vì nó cung cấp câu trả lời cho câu hỏi. Plese, downvote chỉ khi một aswer chứa thông tin sai, không chính xác hoặc gây hiểu lầm –

13
<xsl:for-each select="person"> 
    <xsl:for-each select="*"> 
    <xsl:value-of select="local-name()"/> : <xsl:value-of select="."/> 
    </xsl:for-each> 
</xsl:for-each> 
+0

Thực hành tốt luôn sử dụng bình thường hóa không gian() khi nhận được giá trị của nút Điều này sẽ cắt thêm không gian –

+0

@Rashimi , cảm ơn cho điểm này ra. –

+0

Bình thường hóa/khử trùng như vậy sẽ chỉ cần thiết nếu nó không được xử lý ở giai đoạn thu thập đầu vào. Làm điều đó sau đó tiết kiệm phải làm điều đó tại thời gian truy cập, thường là thường xuyên hơn nhiều. Người ta sẽ làm điều đó trước khi thêm vào một RDB, và một tài liệu xml chỉ là một cơ sở dữ liệu khác. – Patanjali

93

Không ai chỉ ra sự khác biệt tinh tế trong ngữ nghĩa của các chức năng name()local-name().

  • name(someNode) trả về đầy đủ tên của nút, và bao gồm tiền tố và thư đại tràng trong trường hợp nút là một yếu tố hoặc một thuộc tính.
  • local-name(someNode) chỉ trả về tên địa phương của nút và không bao gồm tiền tố và dấu hai chấm trong trường hợp nút là phần tử hoặc thuộc tính .

Do đó, trong trường hợp tên có thể thuộc hai không gian tên khác nhau, bạn phải sử dụng hàm name() để các tên này vẫn được phân biệt.

Và, BTW, người ta có thể xác định cả hai chức năng mà không bất kỳ tranh cãi:

name() là viết tắt cho name(.)

local-name() được viết tắt cho local-name(.)

Cuối cùng, hãy nhớ rằng không chỉ các phần tử và thuộc tính có tên, hai hàm này cũng có thể được sử dụng trên các PI và trên chúng là giống nhau).

7

Đối với những người quan tâm, không có:

<xsl:tag-of select="."/> 

Tuy nhiên bạn có thể tái tạo thẻ/yếu tố bằng cách:

<xsl:element name="{local-name()}"> 
    <xsl:value-of select="substring(.,1,3)"/> 
</xsl:element> 

này rất hữu ích trong một mẫu XSLT rằng cho tay cầm ví dụ định dạng giá trị dữ liệu cho nhiều phần tử khác nhau. Khi bạn không biết tên của phần tử đang được làm việc và bạn vẫn có thể tạo ra cùng một phần tử và sửa đổi giá trị nếu cần.

Các vấn đề liên quan